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

时间:2015-07-13 14:13:23

标签: mongodb mongodb-query

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

我想为“tech_name”添加新的属性“verified:true”到“tech”数组:“Volusion”只会这样才会产生这样的结果,

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

请帮助。

1 个答案:

答案 0 :(得分:5)

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

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

那样做的是:

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

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

    然后,“position”$运算符确保只有从查询部分引用的该数组元素的“匹配索引”才是更新的元素。这使用"dot notation"形式的

    $set: { "tech.$.verified": true }
    

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

  3. 这些是如何运作的基础知识。从这里拿走的主要内容是:

    1. 匹配您要更新的数组中元素的索引值,并通过“点表示法”引用它。

    2. 对字段使用$set操作或其他适当的"update operator",而不是在“更新”中提供“原始”对象结构,否则将“覆盖”现有对象。 / p>