MongoDB 基础入门
MongoDB 简介
基于分布式文件存储的非关系型数据库(NoSQL),为 Web 应用提供可扩展的高性能数据存储解决方案。
数据库操作
- 启动数据库
mongod
- 数据库连接
mongodb://[username:password@]host1[:port1][, host2[:port2], ...[/[database][?options]]
mongodb://localhost
mongodb://localhost, localhost:27018, localhost:27019
- 创建数据库
use DATABASE_NAME
use mongo_db
- 删除数据库
db.dropDatabase()
集合操作
- 创建集合
db.createCollection(name, options)
db.createCollection("my_collection")
- 删除集合
db.collection.drop()
db.my_collection.drop()
文档操作
- 插入文档
db.collection.insert(document)
db.collection.save(document)
db.my_collection.insert({"name": "tt", "address": "hz"})
- 查询文档
db.collection.find(query, projection)
db.my_collection.find({})
db.my_collection.find({"name": "tt", "address": "hz"})
db.my_collection.find({"name": {"$ne": "hz"}})
db.my_collection.find({}).count()
db.my_collection.find({}).limit(1)
db.my_collection.find({}).sort({"name": 1})
- 修改文档
db.collection.update(<query>, <update>, {upsert: <boolean>, multi: <boolean>, writeConcern: <document>})
db.my_collection.update({'name': 'barry'}, {$set: {'address': 'hz'}})
db.collection.save(<document>, {writeConcern: <document>})
db.my_collection.save({"_id": ObjectId("deetete"), "name": "jack", "address": "hz"})
- 删除文档
db.collection.remove(<query>, {justOne: <boolean>, writeConcern: <document>})
do.my_collection.remove({'name': 'jack'})
- 去重文档
db.collection.distinct(field, query, options)
db.my_collection.distinct("name", {"address": {"$ne": "sh"}})
Go 访问 MongoDB
连接数据库
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"time"
)
func main() {
var (
client *mongo.Client
err error
db *mongo.Database
collection *mongo.Collection
)
//连接MongoDB
if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
fmt.Print(err)
return
}
//检查连接
err = client.Ping(context.TODO(), nil)
if err != nil {
fmt.Print(err)
return
}
//选择数据库 my_db
db = client.Database("my_db")
//选择表 my_collection
collection = db.Collection("my_collection")
fmt.Println(collection)
}
插入一条数据
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"time"
)
type ExecTime struct {
StartTime int64 `bson:"startTime"` //开始时间
EndTime int64 `bson:"endTime"` //结束时间
}
type LogRecord struct {
JobName string `bson:"jobName"` //任务名
Command string `bson:"command"` //shell命令
Err string `bson:"err"` //脚本错误
Content string `bson:"content"` //脚本输出
Tp ExecTime //执行时间
}
func main() {
var (
client *mongo.Client
err error
collection *mongo.Collection
iResult *mongo.InsertOneResult
id primitive.ObjectID
)
if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
fmt.Print(err)
return
}
//选择数据库my_db里的某个表
collection = client.Database("my_db").Collection("my_collection")
//插入某一条数据
logRecord := LogRecord{
JobName: "job1",
Command: "echo 1",
Err: "",
Content: "1",
Tp: ExecTime{
StartTime: time.Now().Unix(),
EndTime: time.Now().Unix() + 10,
},
}
if iResult, err = collection.InsertOne(context.TODO(), logRecord); err != nil {
fmt.Print(err)
return
}
//_id:默认生成一个全局唯一ID
id = iResult.InsertedID.(primitive.ObjectID)
fmt.Println("自增ID", id.Hex())
}
批量插入数据
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
)
type ExecTime struct {
StartTime int64 `bson:"startTime"` //开始时间
EndTime int64 `bson:"endTime"` //结束时间
}
type LogRecord struct {
JobName string `bson:"jobName"` //任务名
Command string `bson:"command"` //shell命令
Err string `bson:"err"` //脚本错误
Content string `bson:"content"` //脚本输出
Tp ExecTime //执行时间
}
func main() {
var (
client *mongo.Client
err error
collection *mongo.Collection
result *mongo.InsertManyResult
id primitive.ObjectID
)
if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
fmt.Print(err)
return
}
//选择数据库my_db里的某个表
collection = client.Database("my_db").Collection("test")
//批量插入
result, err = collection.InsertMany(context.TODO(), []interface{}{
LogRecord{
JobName: "job multil1",
Command: "echo multil1",
Err: "",
Content: "1",
Tp: ExecTime{
StartTime: time.Now().Unix(),
EndTime: time.Now().Unix() + 10,
},
},
LogRecord{
JobName: "job multil2",
Command: "echo multil2",
Err: "",
Content: "2",
Tp: ExecTime{
StartTime: time.Now().Unix(),
EndTime: time.Now().Unix() + 10,
},
},
});
if err != nil {
log.Fatal(err)
}
if result == nil {
log.Fatal("result nil")
}
for _, v := range result.InsertedIDs {
id = v.(primitive.ObjectID)
fmt.Println("自增ID", id.Hex())
}
}
查询数据
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
)
type ExecTime struct {
StartTime int64 `bson:"startTime"` //开始时间
EndTime int64 `bson:"endTime"` //结束时间
}
type LogRecord struct {
JobName string `bson:"jobName"` //任务名
Command string `bson:"command"` //shell命令
Err string `bson:"err"` //脚本错误
Content string `bson:"content"` //脚本输出
Tp ExecTime //执行时间
}
//查询实体
type FindByJobName struct {
JobName string `bson:"jobName"` //任务名
}
func main() {
var (
client *mongo.Client
err error
collection *mongo.Collection
cursor *mongo.Cursor
)
if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
fmt.Print(err)
return
}
//选择数据库my_db里的某个表
collection = client.Database("my_db").Collection("test")
cond := FindByJobName{JobName: "job multil1"}
if cursor, err = collection.Find(
context.TODO(),
cond,
options.Find().SetSkip(0),
options.Find().SetLimit(2)); err != nil {
fmt.Println(err)
return
}
defer func() {
if err = cursor.Close(context.TODO()); err != nil {
log.Fatal(err)
}
}()
//遍历游标获取结果数据
for cursor.Next(context.TODO()) {
var lr LogRecord
//反序列化Bson到对象
if cursor.Decode(&lr) != nil {
fmt.Print(err)
return
}
fmt.Println(lr)
}
var results []LogRecord
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
for _, result := range results {
fmt.Println(result)
}
}
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
)
type ExecTime struct {
StartTime int64 `bson:"startTime"` //开始时间
EndTime int64 `bson:"endTime"` //结束时间
}
type LogRecord struct {
JobName string `bson:"jobName"` //任务名
Command string `bson:"command"` //shell命令
Err string `bson:"err"` //脚本错误
Content string `bson:"content"` //脚本输出
Tp ExecTime //执行时间
}
//查询实体
type FindByJobName struct {
JobName string `bson:"jobName"` //任务名
}
func main() {
var (
client *mongo.Client
err error
collection *mongo.Collection
cursor *mongo.Cursor
)
if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
fmt.Print(err)
return
}
//选择数据库my_db里的某个表
collection = client.Database("my_db").Collection("test")
filter := bson.M{"jobName":"job multil1"}
if cursor, err = collection.Find(
context.TODO(),
filter,
options.Find().SetSkip(0),
options.Find().SetLimit(2)); err != nil {
log.Fatal(err)
}
defer func() {
if err = cursor.Close(context.TODO()); err != nil {
log.Fatal(err)
}
}()
var results []LogRecord
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
for _, result := range results {
fmt.Println(result)
}
}
BSON 复合查询
BSON,JSON 的二进制表示,两大类型表示 BSON 数据:
一、D类型
4 个子类:
- D:BSON 文档,有序 map 。
- M:无序 map 。
- A:一个 BOSN 数组。
- E:D 中的一个元素。
bson.D{{
"name",
bson.D{{
"$in",
bson.A{"Jim", "Jack"},
}}
}}
二、Raw 类型
验证字节切片,反序列化 BSON 。
package main
import (
"fmt"
"go.mongodb.org/mongo-driver/bson"
)
func main() {
testM := bson.M{
"jobName": "job multi1",
}
var raw bson.Raw
tmp, _ := bson.Marshal(testM)
bson.Unmarshal(tmp, &raw)
fmt.Println(testM)
fmt.Println(raw)
}
聚合查询
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
)
func main() {
var (
client *mongo.Client
collection *mongo.Collection
err error
cursor *mongo.Cursor
)
if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
fmt.Print(err)
return
}
collection = client.Database("my_db").Collection("test")
//按照jobName分组,countJob中存储每组的数目
groupStage := mongo.Pipeline{bson.D{
{"$group", bson.D{
{"_id", "$jobName"},
{"countJob", bson.D{
{"$sum", 1},
}},
}},
}}
if cursor, err = collection.Aggregate(context.TODO(), groupStage, ); err != nil {
log.Fatal(err)
}
defer func() {
if err = cursor.Close(context.TODO()); err != nil {
log.Fatal(err)
}
}()
var results []bson.M
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
for _, result := range results {
fmt.Println(result)
}
}