go学习记录6-mongo-driver

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值