2013-07-20 56 views
2

我有「節點」

這裏是我的Mongo的文檔結構

db.nodes.find() 
{ _id : ObjectId("skipped"), 
nodeid : "node1" 
nodes : [ 
    { nodeid : "node11" 
     sku : [ 
      "aaa", 
      "bbb", 
      "ccc"] 
    }, 
    { nodeid : "node12" 
     sku : [ 
      "bbb", 
      "ddd"] 
    }] 
} 
{ _id : ObjectId("skipped"), 
nodeid : "node2" 
nodes : [ 
    { nodeid : "node21" 
     sku : [ 
      "aaa", 
      "bbb", 
      "ddd"] 
    }] 
} 

我使用數組的子對象:

db.nodes.update({'nodes.sku': 'bbb'},{$pull: {'nodes.$.sku':'bbb'}}, {multi: 1}) 

有結果:

db.nodes.find() 
{ _id : ObjectId("skipped"), 
nodeid : "node1" 
nodes : [ 
    { nodeid : "node11" 
     sku : [ 
      "aaa", 
      "ccc" 
     ] 
    }, 
    { nodeid : "node12" 
     sku : [ 
      "bbb", 
      "ddd", 
     ] 
    } 
] 
} 
{ _id : ObjectId("skipped"), 
nodeid : "node2" 
nodes : [ 
    { nodeid : "node21" 
     sku : [ 
      "aaa", 
      "ddd" 
     ] 
    } 
] 
} 

「node 1.node12" 仍然有對象 「BBB」

我嘗試使用:

db.nodes.update({'nodes': {$elemMatch: {'sku':'bbb'}}},{$pull: { nodes: {'sku':'bbb'}}}, {multi: 1}) 

,並有結果:

db.nodes.find() 
{ _id : ObjectId("skipped"), 
nodeid : "node1" 
nodes : [ 
] 
} 
{ _id : ObjectId("skipped"), 
nodeid : "node2" 
nodes : [ 
    { nodeid : "node21" 
     sku : [ 
      "aaa", 
      "ddd" 
     ] 
    } 
] 
} 

我失去了所有數據 「節點1」

和正確從「node2.node12」拉對象

一些建議

謝謝, Vassili

+0

'$'僅代表_first_匹配數組元素的索引,因此您不能使用它來更新多個元素。 – JohnnyHK

+0

似乎,它重複http://stackoverflow.com/questions/5228210/how-to-remove-an-element-from-a-doubly-nested-array-in-a-mongodb-document – sneawo

回答

2

不幸的是,你想要做的是不支持。該功能申請單是在這裏,如果你想投上一票:

https://jira.mongodb.org/browse/SERVER-1243

在此期間,有幾個選項:

  1. 重新設計您的文檔。下面是常見的圖案的鏈接的樹形結構模式:http://docs.mongodb.org/manual/tutorial/model-tree-structures/

  2. 繼續使用當前的設計和執行多個更新或做一個查找,修改你的應用程序的節點陣列和做多的更新。請注意,在這些情況下,您將無法在單個文檔中進行原子級的所有修改。