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

时间:2013-12-23 11:02:42

标签: arrays json mongodb

我有一个像。的收集文档。

{'_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'}]

            }

现在我想将多个数组元素字段'status'更新为'已删除',这是在JSON内部。让我们假设对于taskId 3,4我需要将状态更新为已删除。我已经尝试使用带有查询($)的$ in这个查询,但它更新的第一个元素只是$ in array。在下面的查询中,只有taskId和3正在更新而不是4。

db.projectPlan.update({"_id": 1,'tasks.taskId': {$in :[3,4]}} , {$set: {'tasks.$.status': 'Deleted'}}, {upsert: false, multi: true});

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

1 个答案:

答案 0 :(得分: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);
});