【问题标题】:Add Fields to MongoDB Inner Object向 MongoDB 内部对象添加字段
【发布时间】:2020-09-29 03:42:14
【问题描述】:

我正在尝试将字段附加到我的 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}},
    }

我希望我的文档是什么样的

【问题讨论】:

    标签: mongodb go bson


    【解决方案1】:

    您需要的是 $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())
    }
    
    

    【讨论】:

    • 这不符合我的要求,您完全省略了我稍后需要的 idString。我用图片更新了问题。
    • 仔细查看更新命令@astronik。 idString 在那里。
    • 是的,就是这样。谢谢
    • 很高兴帮助@astronik。如果这能解决您的问题,请接受答案。
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2014-05-16
    • 2012-10-27
    • 2011-05-25
    相关资源
    最近更新 更多