【问题标题】:How to update document in an object in an array in an object in an array using MongoDB?如何使用 MongoDB 在数组中的对象中更新数组中的对象中的文档?
【发布时间】:2020-06-13 04:18:13
【问题描述】:

使用 MongoDB 查询:
1.如何找到_id A3的对象?
2. 如何将 _id A3 的对象更新为 A4

请注意:数据库是一个对象数组,其中一个键具有一个对象数组

[{
"project_name": "ProjectA",
"issues":[{"issue_title":"TitleA1", "_id":"A1"},
          {"issue_title":"TitleA2","_id":"A2"},
          {"issue_title":"TitleA3","_id":"A3"}]
},
{
"project_name": "ProjectB",
"issues":[{"issue_title":"TitleB1", "_id":"B1"},
          {"issue_title":"TitleB2","_id":"B2"},
          {"issue_title":"TitleB3","_id":"B3"}]
}
]

【问题讨论】:

    标签: arrays mongodb mongoose mongodb-query


    【解决方案1】:

    您可以通过嵌套_id 使用dot notation$match 您的对象,并使用$unwind$replaceRoot 将嵌套对象提升到顶层:

    db.collection.aggregate([
        {
            $unwind: "$issues"
        },
        {
            $match: { "issues._id": "A3" }
        },
        {
            $replaceRoot:{ newRoot: "$issues" }
        }
    ])
    

    Mongo Playground

    positional operator 可以用来更新那个:

    db.col.updateOne({ "project_name": "ProjectA", "issues._id": "A3" }, { $set: { "issues.$._id": "A4" } })
    

    【讨论】:

    • 我不确定这是否有效,因为起始数据集是一个数组...您能否确认您的代码可以绕过 2 个数组?我不确定我测试代码是否错误,或者代码是否无法访问双数组。也许它需要 $elemMatch 某处,但我尝试了很多次,但无法让它工作
    • 是这样的:mongoplayground.net/p/8yPdPJ1C2cB 吗?或者你能准确地展示单个物体的样子吗?
    • 啊,是的,就像在那个操场上一样。问题 1 是如何自己返回这个对象 {"issue_title":"TitleA3","_id":"A3"}。我尝试了您建议的代码,但它给了我错误,也许我们需要以某种方式集成“聚合”?
    • @wongz 修改了我的答案
    • 谢谢,第一个代码有效。第二个可能也需要聚合?
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2021-08-08
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多