为了账号安全,请及时绑定邮箱和手机立即绑定

Mongo-go如何使用arrayFilter在“对象数组内的对象数组”中查找元素

Mongo-go如何使用arrayFilter在“对象数组内的对象数组”中查找元素

Go
慕虎7371278 2023-06-19 16:56:19
让我们想象一个像这样的 JSON:"user": {  "id": "1234",  ...some fields,  "achievements": [    {      "scope": "life achievements",      "list": [        {"_id": 1, "title": "some text", "gotAt": "some date"},        {"_id": 2, "title": "some other text", "gotAt": "some date"}      ]    },    {      "scope": "sport achievements",      "list": [        {"_id": 1, "title": "sport", "gotAt": "some date"},        {"_id": 2, "title": "some other sport", "gotAt": "some date"}      ]    },    {      "scope": "academic achievements",      "list": [        {"_id": 1, "title": "some text", "gotAt": "some date"},        {"_id": 2, "title": "some other text", "gotAt": "some date"}      ]    },  ]}例如,我需要使用 mongoDb 和 Golang 驱动程序 Mongo-go 更新第一个人生成就(id 为 1)问题出在嵌套级别。我可以通过 $ mongoDb 运算符获取一些数组元素,但在这里我需要通过活动范围(生活、运动、学术等)和成就的 _id 字段来识别每个用户成就。所以我需要在其他对象数组中的对象数组中进行搜索。这就是我所做的(无论如何它都不起作用)doc := coll.FindOneAndUpdate(        context.Background(),        bson.D{            {"_id", "1234"},            {"achievements.scope", "life achievements"},            {"achievements.list._id", 1},        },        bson.D{            {"$set", bson.D{                {"achievements.$.list.$[elem].title", "some new test"},            }},        },        options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{            Filters: append(make([]interface{}, 0), bson.D{                {"elem", bson.D{                    {"achievements.list._id", 1},                }},            }),        }).SetReturnDocument(1),    )我希望此查询仅更新“id”和“scope”字段指定的一个元素。可能是我不正确地使用了 arrayFilters,也可能是我错误地设置了 FindOneAndUpdate 函数的参数。现在它不会抛出任何错误,也不会更新文档。请帮我
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

有了这个包,go.mongodb.org/mongo-driver/mongo你可以这样做:


coll.FindOneAndUpdate(

    context.Background(),

    bson.D{

        {"id", "1234"},

        {"achievements.scope", "life achievements"},

        {"achievements.list._id", 1},

    },

    bson.M{"$set": bson.M{"achievements.$.list.$[elem].title": "some new test"}},

    options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{

        Filters: []interface{}{bson.M{"elem._id": 1}},

    }),

)

将其“翻译”为 shell:


db.user.findOneAndUpdate(

  {"id": "1234","achievements.scope": "life achievements","achievements.list._id": 1},

  {$set: {"achievements.$.list.$[elem].title": "some new test"}},

  {arrayFilters: [{"elem._id": 1}]}

)


查看完整回答
反对 回复 2023-06-19
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

doc := coll.FindOneAndUpdate(

        context.Background(),

        bson.D{

            {"_id", "1234"},

            {"achievements.scope", "life achievements"},

        },

        bson.D{

            {"$set", bson.D{

                {"achievements.$.list.$[elem].title", "some new text"},

            }},

        },

        options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{

            Filters: []interface{}{bson.D{

                    {"elem._id", 1},

                }},

        }).SetReturnDocument(1),

    )


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信