MongoDB - 更新 JSON 数组中的多个元素

4
我有一个像 . 的集合文档。
{'_id':1,
             'name':'Root',
             'taskId':1,
             'parentId':"",
             'path':[1],
             'tasks':[  {"taskId":3,parentId:1,name:'A',status:'Created'},
                        {"taskId":4,parentId:1,name:'D',status:'Created'},
                        {"taskId":5,parentId:4,name:'B',status:'Created'},
                        {'type':'project' , 'proRef':2},
                        {"taskId":6,parentId:3,name:'E',status:'Started'},
                        {"taskId":7,parentId:6,name:'C',status:'Stopped'}]

            }

现在我想要更新JSON中多个数组元素字段“status”为“已删除”。假设对于taskId 3,4,我需要将状态更新为“已删除”。我尝试使用$in和query($)进行查询,但它只会更新$in数组中的第一个元素。在下面的查询中,只有taskId为3的元素被更新,而不是4。
db.projectPlan.update({"_id": 1,'tasks.taskId': {$in :[3,4]}} , {$set: {'tasks.$.status': 'Deleted'}}, {upsert: false, multi: true});

如何在单个查询中更新多个元素。谢谢!

1
根据@Gergo的回答,这是不可能的。您的架构表明您正在查看某种项目管理/计划工具,在这种情况下,您可能希望将任务单独放在一个集合中,因为有许多用例需要单独查询任务(分配给X人的任务,状态为Y的任务等)。 - Remon van Vliet
1个回答

5
很遗憾,这是 MongoDB 的限制,无法实现。根据文档 (http://docs.mongodb.org/manual/reference/operator/update-array/):

$ 作为占位符,在更新时可以更新与查询条件匹配的第一个元素。

有关详细信息,请参见此票证:https://jira.mongodb.org/browse/SERVER-1243

但是在 MongoDB shell 中是可能的:

db.projectPlan.find({"_id": 1}).forEach(function(plan) {
  plan.tasks.forEach(function(task) {
    if(task.taskId in { 3: 1, 4: 1 }) {
      task.status = "Deleted";
    }
  });
  db.projectPlan.save(plan);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接