如何在MongoDB中的嵌套子文档数组中添加新属性

rah*_*ave 0 mongodb mongodb-query

{
    "_id" : ObjectId("559f85351554febf038b5c70"),
    "company_name" : "Honey Crunch Popcorn Co",
    "tech" : [
        {
            "tech_name" : "Magento",
            "user" : "Rahul",
        },
        {
            "tech_name" : "Volusion",
            "user" : "Tina",
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我只想将新属性“ verified:true”添加到“ tech_name”:“ Volusion”的“ tech”数组中,这样就可以得到结果,

{
    "_id" : ObjectId("559f85351554febf038b5c70"),
    "company_name" : "Honey Crunch Popcorn Co",
    "tech" : [
        {
            "tech_name" : "Magento",
              "user" : "Rahul"
        },
        {
            "tech_name" : "Volusion",
            "user" : "Tina",
            "verified" : "true"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

请帮忙。

Bla*_*ven 5

为此,您可以$set在update语句中使用运算符,同时通过positional $运算符引用匹配的数组元素:

db.collection.update(
    {
        "_id": ObjectId("559f85351554febf038b5c70"),
        "tech.tech_name": "Volution"
    },
    {
        "$set": {
            "tech.$.verified": true
        }
    }
)
Run Code Online (Sandbox Code Playgroud)

所以这样做是:

  1. 两者的“查询”或第一个参数部分.update()都通过字段引用找到一个唯一的文档(不是真正需要的),其次在嵌套数组中找到一个自己匹配的“字段/属性”的字段。最后一部分对于下一阶段很重要。

  2. 该方法的“更新”部分在.update()这里作为“第二”参数,包含“修改后的内容”的定义。在$set此处使用运算符可确保仅以任何方式修改引用的字段。

    然后,$此处的“位置” 运算符可确保仅从查询部分引用的数组元素的“匹配索引”是要更新的元素。这使用了“点符号”形式

    $set: { "tech.$.verified": true }
    
    Run Code Online (Sandbox Code Playgroud)

    这将引用元素中的“正确”索引字段,并“创建”一个不存在的新属性,否则将“覆盖”现有值。

这些是工作原理的基础。从这里带走的主要事情是:

  1. 匹配要更新的数组中元素的索引值,并通过“点符号”对其进行引用。

  2. 对字段使用$set操作或其他适当的“更新运算符”,而不要在“更新”中提供否则将“覆盖”现有对象的“原始”对象结构。