亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 函數的參數?,F在它不會拋出任何錯誤,也不會更新文檔。請幫我
查看完整描述

2 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

有了這個包,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 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號