mongo接入
application配置
db:
mgo:
address1: dds-2***1.mongodb.rds.aliyuncs.com
port1: 3717
address2: dds-2***2.mongodb.rds.aliyuncs.com
port2: 3717
database: demo
user: root
password: Demo@123!
# pool_size: 100
- 问题记录
密码中存在@,mongoUrl格式为:
uri: mongodb://root:@dds-.mongodb.rds.aliyuncs.com:3717,dds-**.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-41363516
@用来分隔密码与address:port,密码中出现@,程序找不到断点,故解决方式如下:
password: Demo@123!
改为:
password_1st: Meiyou
password_2nd: 123!
并用%40代替@
package mongo
import (
"AiManagement/config"
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
)
//保存MongoDb连接
var MgoDb *mongo.Database
//创建到MongoDb的连接
func init() {
//%s@%s解决密码中出现@问题
dsn := fmt.Sprintf("mongodb://%s:%s%s%s@%s:%s,%s:%s/%s?authSource=admin",
config.Config.Application.DB.Mgo.User,
config.Config.Application.DB.Mgo.PasswordSt,
"%40",
config.Config.Application.DB.Mgo.PasswordNd,
config.Config.Application.DB.Mgo.Address1,
config.Config.Application.DB.Mgo.Port1,
config.Config.Application.DB.Mgo.Address2,
config.Config.Application.DB.Mgo.Port2,
config.Config.Application.DB.Mgo.Database)
clientOptions := options.Client().ApplyURI(dsn)
// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
MgoDb = client.Database(config.Config.Application.DB.Mgo.Database)
fmt.Println("Connected to MongoDB!")
}
到这一步就已经连接到指定mongo库了。
增删改查
表(Collection)
单一性设计原理,一个model中大多数是对一个表进行操作,提取连接表得代码为通用代码。
const demoTableName = `demo`
var demoCollection = mongo.MgoDb.Collection(demoTableName)
type Demo struct {
Id primitive.ObjectID `bson:"_id"`
Name string `bson:"name"`
Comment string `bson:"comment"`
Child []Child `bson:"child "`
}
type Child struct {
Id primitive.ObjectID `bson:"_id"`
Name string `bson:"name"`
Comment string `bson:"comment"`
}
增加操作
func AddDemo(d *Demo) error {
d.Id = primitive.NewObjectID()
insertResult, err := demoCollection.InsertOne(context.TODO(), d)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted a single document: ", insertResult.InsertedID)
return err
}
- 问题记录:mongo主键问题
第一次操作时我没有写 d.Id = primitive.NewObjectID(),mongo并没有帮我自动生成唯一id,所有新增操作都生成了id:00000000000000000000000000000
修改操作
根据主键修改
func UpdateDemo(u *Demo) error {
update := bson.M{"$set": u}
updateResult, err := demoCollection.UpdateOne(context.Background(), bson.M{"_id": u.Id}, update)
if err != nil {
log.Fatal(err)
}
log.Println("collection.UpdateOne:", updateResult)
return err
}
二级嵌套结构数组中元素删除
需求:删除child数组结构中指定id得元素
update := bson.D{
{"$pull", bson.D{
{"child", bson.M{"_id": id}},
}},
}
_, err = demoCollection.UpdateMany(context.Background(), bson.M{}, update)
二级嵌套结构数组中元素修改
需求:更新child数组结构中指定id得元素
update := bson.M{"$set": bson.M{"child.$": u}}
personaFilter := bson.M{"child._id": u.Id}
_, err = demoCollection.UpdateMany(context.Background(), personaFilter, update)
主键id
mongodb中的_id的ObjectId的生成规则
原文链接:https://blog.csdn.net/maxchenBug/article/details/88153755