2013-12-23 59 views
3

我有一個類似的集合文檔。Mongodb - 更新JSON數組內的多個數組元素

{'_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。讓我們假設的TaskID 3,4我需要更新狀態已刪除。我已經用$ in查詢了這個查詢($),但是它只是更新了第一個元素$ 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等) –

回答

4

恐怕這是不可能的,這是MongoDB的限制。從文檔(http://docs.mongodb.org/manual/reference/operator/update-array/):

$用作佔位符,來更新在更新相匹配的 查詢條件的第一個元素。

詳情請參閱此票:https://jira.mongodb.org/browse/SERVER-1243

這是可能的,雖然在MongoDB中殼:

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); 
}); 
+0

現在終於有可能。 https://jira.mongodb.org/browse/SERVER-1243 – EdWood