我正在尝试将字段追加到mongodb集合中的对象。到目前为止,这就是我在MongoDB中的文档的样子。
我的用户可以有多个设备,所以我试图将更多字段附加到devices对象。我尝试将$ push用于数组而不是对象,但是我不喜欢稍后从数据库检索数据时如何访问数据。
因此我开始使用$ set。 $ set非常有用,因为它为我提供了我希望数据保存在db中的格式,但是每次都会不断覆盖devices对象中的一个键值对,并且我不希望这种情况发生。
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}},
}
我希望我的文档看起来像什么最佳答案
您不需要使用$ push或$ addFields而是$ set指令。
要在嵌入式文档中指定字段,请使用点符号。
对于符合标准_id等于100的文档,以下操作将更新设备文档中的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())
}
关于mongodb - 将字段添加到MongoDB内部对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64107527/