【问题标题】:Mongoose update array of subdocuments [duplicate]猫鼬更新子文档数组[重复]
【发布时间】:2015-06-03 11:35:54
【问题描述】:

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

{
    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 中的 first 子文档。在文档中写道,这种查询仅更新第一个文档。我想知道是否有办法更新数组中所有匹配的子文档。提前致谢。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案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);
    });
    

    【讨论】:

    • 但是没有其他方法包括查询吗?不循环
    • 除了循环更新之外,您还可以阅读文档、手动编辑并保存它以替换旧文档,以确保您避免updating if current 的任何竞争条件。如果您想在下一个版本中看到此问题的解决/合并,您可以投票支持JIRA 问题。
    猜你喜欢
    • 2020-08-05
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多