知识点掌握了,还需要不断练习才能熟练运用。下面小编给大家带来一个golang开发实战,手把手教大家学习《将字段添加到 mongoDB 内部对象》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
问题内容
我正在尝试将字段附加到 monGodb 集合中的对象。到目前为止,这就是我在 mongodb 中的文档的样子。
我的用户可以拥有多个设备,因此我尝试将更多字段附加到设备对象。我尝试将 $push 用于数组而不是对象,但我不喜欢稍后从数据库检索数据时必须如何访问数据。
所以我开始使用$set。 $set 效果很好,因为它为我提供了我希望数据保存在数据库中的格式,但它每次都会不断地覆盖设备对象中的一个键值对,我不希望这种情况发生。
db.go
func aDDDevicetoprofile(uid string, deviceid int, devicename string) {
client := connectclient()
col := client.database(uid).collection("user")
idstring := strconv.itoa(deviceid)
filter := bson.m{"uid": uid}
update := bson.m{
"$set": bson.m{"devices": bson.m{idstring: devicename}}, <------ need to fix this
}
option := options.findoneandupdate()
_ = col.findoneandupdate(context.todo(), filter, update, option)
log.print("device added")
_ = client.disconnect(context.todo())
}
我已经研究过使用 $addfields 但我不知道我做得是否正确,我只是替换了上面的 $set 并添加了 $addfields 并且我也尝试了这种方式
update := bson.M{
"devices": bson.M{"$addFields": bson.M{idString: deviceName}},
}
我希望我的文档是什么样的
解决方案
您需要的是 $set 指令,而不是使用 $push 或 $addfields。
要指定嵌入文档中的字段,请使用点表示法。
对于匹配条件 _id 等于 100 的文档,以下操作会更新 devices 文档中的 make 字段:
db.products.update(
{ _id: 100 },
{ $set: { "devices.make": "zzz" } }
)
将它们转换为 go 语法也很容易。你正在做的事情是正确的。以下内容应该可以工作,或者可能需要一些调整。
func AddDeviceToProfile(uid string, deviceId int, deviceName string) {
client := ConnectClient()
col := client.Database(uid).Collection("User")
idString := strconv.Itoa(deviceId)
filter := bson.M{"uid": uid}
update := bson.M{"$set": bson.M{"devices." + idString: deviceName}}
option := options.FindOneAndUpdate()
_ = col.FindOneAndUpdate(context.TODO(), filter, update, option)
log.Print("Device Added")
_ = client.Disconnect(context.TODO())
}