Mongoose更新子文档数组

时间:2015-03-30 12:38:09

标签: node.js mongodb express mongoose

我可以更新匹配更新查询的数组中的所有子文档吗?以下是集合元素的示例:

{
    x: 1,
    myarray: [
        {
           a: 1,
           b: 2,
        },
        {
           a: 1,
           b: 4,
        }  
    ]
}

然后我写这样的查询:

    MyModel.update({x: 1, myarray.a: 1}, 
                   {$set: 
                      {"myarray.$.b": 3}
                   },
                   function(err) {
    });

它仅更新myarray中的第一个子文档。在文档中写道,这种查询仅更新第一个文档。我想知道是否有办法更新数组中所有匹配的子文档。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您目前无法使用positional operator执行此操作,并且此处有JIRA。但是,一个工作周期是循环遍历每个匹配的文档并在该文档中循环遍历更新匹配元素的数组:

db.collection.find({"x": 1, "myarray.a": 1}).forEach(function(doc) {
    doc.myarray.forEach(function(item){
        if(item.a == 1){
            item.b = 3;
        }
    });
    db.collection.save(doc);
});