首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用arrayFilter在“对象数组内的对象数组”中查找元素

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

Stack Overflow用户
提问于 2019-05-25 23:22:46
回答 2查看 4.2K关注 0票数 3

让我们想象一下这样的JSON:

代码语言:javascript
复制
"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 driver Mongo-go更新第一个人生成就( id为1)。

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

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

代码语言:javascript
复制
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函数的参数。现在它不会抛出任何错误,也不会更新文档。请帮帮我

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-26 11:42:47

试试这个:

mongo-go-driver:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 } ]}
)
票数 10
EN

Stack Overflow用户

发布于 2019-05-26 20:06:31

因此,在@owlwalks的帮助下,我们找到了决定:

代码语言:javascript
复制
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),
    )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56306164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档