如何使用 MongoDB 在数组中的对象中更新数组中的对象中的文档?

Posted

技术标签:

【中文标题】如何使用 MongoDB 在数组中的对象中更新数组中的对象中的文档?【英文标题】:How to update document in an object in an array in an object in an array using 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"]

]

【问题讨论】:

【参考方案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 修改了我的答案 谢谢,第一个代码有效。第二个可能也需要聚合?

以上是关于如何使用 MongoDB 在数组中的对象中更新数组中的对象中的文档?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb更新数组中的单个对象

如何更新数组NodeJS,MongoDB中的特定对象

MongoDB。如何更新数组内的json属性

使用mongoose在mongoDB中更新数组的数组

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

MongoDB - 基于嵌套数组的字段值更新数组对象中的字段