Mongo 组件
Mongo 组件我们依赖的开源包是 go.mongodb.org/mongo-driver/mongo
。
按照组件的设计,我们定义了自己的 Mgo 结构对其进行了组合,在保留其原生的功能之外,以便扩展。
// yago/coms/mgo/mgo.go
type Mgo struct {
*mongo.Database
}
type Collection struct {
c *mongo.Collection
}
type Cursor struct {
c *mongo.Cursor
}
所以你可以查看 mongo 官方文档 来获取所有支持的 api。
本文中仅介绍部分常用的 api 以及扩展的 api。
1. 配置 Mongo 组件
[mongodb]
# https://docs.mongodb.com/manual/reference/connection-string/
mongodb_uri = "mongodb://user:password@127.0.0.1:27017/?connectTimeoutMS=5000&socketTimeoutMS=5000&maxPoolSize=100"
database = "test"
我们在模版 app.toml 中默认配置开启了 mgo 组件,可根据实际情况进行调整。
2. 使用 Mongo 组件
2.1. 增加
- 添加一行记录
import "go.mongodb.org/mongo-driver/bson"
insertResult, err := mgo.Ins().C("test").InsertOne(bson.M{"name": "tom"})
- 添加多行记录
insertResult, err := mgo.Ins().C("test").InsertMany(bson.A{
bson.M{"name": "henry"},
bson.M{"name": "lily"},
bson.M{"name": "sheldon"},
})
2.2. 删除
- 删除一行记录
result, err := mgo.Ins().C("test").DeleteOne(bson.M{"name":"henry"})
- 删除多行记录
result, err:= mgo.Ins().C("test").DeleteMany(bson.M{"name":"henry"})
2.3. 修改
- 替换一行记录
result, err := mgo.Ins().C("test").ReplaceOne(bson.M{"name":"sheldon"}, bson.M{"name":"lily","age": 18})
- 更新一行记录
result, err := mgo.Ins().C("test").UpdateOne(bson.M{"name": "sheldon"}, bson.M{"$set": bson.M{"age": 18}})
- 更新多行记录
result, err := mgo.Ins().C("test").UpdateMany(bson.M{"name": bson.M{"$ne": ""}}, bson.M{"$set": bson.M{"age": 18}})
2.4. 查询
- 查询一行记录
findResult := mgo.Ins().C("test").FindOne(bson.M{"name": "henry"})
result := bson.M{}
err := findResult.Decode(&result)
- 查询多行记录
cursor, err := mgo.Ins().C("test").Find(bson.M{})
defer cursor.Close()
resultAll := bson.A{}
if err := cursor.All(&resultAll); err != nil {
}
- 查询记录条数
result, err := mgo.Ins().C("test").CountDocuments(bson.M{"name":"tom"})
- 查询 Distinct
result, err := mgo.Ins().C("test").Distinct("name", bson.M{})
- 聚合 Aggregate
cursor, err := mgo.Ins().C("test").Aggregate(bson.A{bson.D{bson.E{Key: "$skip", Value: 1}}})
if err != nil {
// deal err
}
resultAll := bson.A{}
if err := cursor.All(&resultAll); err != nil {
// deal err
}
2.5. 复合操作
- 更新或添加
result, err := mgo.Ins().C("test").Upsert(bson.M{"name": "test"}, bson.M{"name": "test", "age": 18})
- BulkWrite
result, err := mgoClient.C("test").BulkWrite([]mongo.WriteModel{
&mongo.InsertOneModel{Document: bson.M{"name": "x"}},
&mongo.DeleteOneModel{Filter: bson.M{"name": "x"}},
})
- 查找修改
findResult := mgo.Ins().C("test").FindOneAndUpdate(bson.M{"name": "lily"},bson.M{"$set":bson.M{"age":17}})
if findResult.Err() != nil {
// deal err
}
result := bson.M{}
if err := findResult.Decode(&result);err != nil {
// deal err
}
- 查找删除
findResult := mgo.Ins().C("test").FindOneAndDelete(bson.M{"name":"lily"}})
if findResult.Err() != nil {
// deal err
}
result := bson.M{}
if err := findResult.Decode(&result);err != nil {
// deal err
}
- 查找替换
findResult := mgo.Ins().C("test").FindOneAndReplace(bson.M{"name": "lily"},bson.M{"$set":bson.M{"name":"lily","age":18}})
if findResult.Err() != nil {
// deal err
}
result := bson.M{}
if err := findResult.Decode(&result);err != nil {
// deal err
}