dsfphczao23473056 2019-05-25 15:22 采纳率: 100%
浏览 515
已采纳

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

假如有这样一个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驱动程序mongogo更新第一人生成就(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”和“作用域”字段指定的元素。可能是我不恰当地使用arrayFilters,也可能是我不正确地设置了FindOneandUpdate函数的Param。导致现在它不会抛出任何错误,也不会更新文档。请帮帮我吧!

  • 写回答

2条回答 默认 最新

  • dongzhila3786 2019-05-26 03:42
    关注

    try this:

    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}},
        }),
    )
    

    which "translates" to 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 } ]}
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题