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

Ser*_*pin 3 go mongodb mgo mongo-go

让我们想象一个像这样的 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"}
      ]
    },
  ]
}
Run Code Online (Sandbox Code Playgroud)

例如,我需要使用 mongoDb 和 Golang 驱动程序 Mongo-go 更新第一个人生成就(ID 为 1)

问题出在嵌套级别。我可以通过 $ mongoDb 运算符获取一些数组元素,但在这里我需要通过活动范围(生活、运动、学术等)和 _id 成就领域来识别每个用户的成就。所以我需要在其他对象数组内的对象数组中进行搜索。

这就是我所做的(无论如何它不起作用)

"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"}
      ]
    },
  ]
}
Run Code Online (Sandbox Code Playgroud)

我希望此查询仅更新“id”和“scope”字段指定的一个元素。可能是我不正确地使用了 arrayFilters,或者可能是我错误地设置了 FindOneAndUpdate 函数的参数。现在它不会抛出任何错误,也不会更新文档。请帮我

owl*_*lks 10

尝试这个:

mongo-go-driver:

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}},
    }),
)
Run Code Online (Sandbox Code Playgroud)

其中“翻译”为外壳:

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 } ]}
)
Run Code Online (Sandbox Code Playgroud)