MongoDB更新所有文档中的嵌套数组的所有元素

时间:2018-09-26 16:22:36

标签: json mongodb mongodb-query

我有一个集合(称为客户),其中包含多个文档,每个文档代表一个客户。每个客户文档包含一个phoneNumber文档数组。我想更新集合中所有客户文档中的所有phoneNumber文档,以便为每个phoneNumber文档添加一个readOnly属性。

挑战在于某些phoneNumber文档具有readOnly属性,我认为这使我失望...

以下示例JSON文档;

{
    "_id" : ObjectId("5baa8e5da61b7842284937b7"),
    "clientID" : "00001",
    "firstName" : "Jonathan",
    "middleName" : "Herbert",
    "lastName" : "Alexander",
    "dateOfBirth" : "1965-04-04",
    "email" : "jonalex@hcare.com",
    "phoneNumbers" : [ 
        {
            "phoneID" : "001",
            "number" : "(404) 242-5939",
            "phoneType" : "HOME"
        },
        {
            "phoneID" : "001",
            "number" : "(404) 242-5939",
            "phoneType" : "HOME"
            "readOnly" : true
        },
        {
            "phoneID" : "001",
            "number" : "(404) 242-5939",
            "phoneType" : "HOME"
        }
    ],
    "gender" : "M"
}

在此示例中,我希望所有phoneNumber文档都具有readOnly:false属性。

我尝试使用以下内容...

db.Clients.update(
   {},
   { $set: { "phoneNumbers.$[].readOnly" : true } },
   { multi: true}
)

...但是它给我一个错误,因为我不打算使用零件来遍历元素,所以我被卡住了。

如何更新此集合中的所有文档,以将readOnly字段添加到每个文档的嵌套phoneNumbers数组中的所有元素?

1 个答案:

答案 0 :(得分:0)

这将是一个示例查询。
这会将所需的元素推送到每个电话号码文档中。如果您不尝试

var results = db.Clients.find({"phoneNumbers.readOnly" : {$exists : false } });
results.forEach(function (result){
    result.phoneNumbers.forEach(function (doc){
       doc.push({"phoneNumbers.$[].readOnly" : true })
    })
});