2013-10-17 57 views
5

我試圖從嵌入的數組中刪除一個對象($pull)。 (使用JavaScript/Node.js的驅動程序)。

這裏是樣本數據,其中一,二,三是層次:

{ 
    one : "All", 
    one : [ 
     { 
     name: "People", 
     two: [ 
      { 
      three_id: 123, 
      three: "Jonny", 
      }, 
      { 
      three_id: 456, 
      three: "Bobby", 
      } 
     ] 
     }, 
     { 
     name: "Animals", 
     two: [ 
      { 
      three_id: 828, 
      three: "Cat", 
      }, 
      { 
      three_id: 282, 
      three: "Dog", 
      } 
     ] 
     } 
    ] 
} 

在這個例子中,我試圖擺脫鮑比」 」。

我可以成功地在「三個層次」匹配的文件,如果我想,這樣的:

db.test.find({"one.two.three_id" : 456}); 

但是,我不知道如何消除使用update這個紀錄。這裏有一些嘗試,沒有一個工作:

// failed attempts 
db.test.update({"one.two.three_id" : 456}, {$pull:{'one.$.two.$.three_id': 456}}); 
db.test.update({"one.two.three_id" : 456}, {$pull:{'three_id': 456}}); 

// deletes entire level two "People" 
db.test.update({"one.two.three_id" : 456}, {$pull: {one: {two : {$elemMatch: {'three_id': 456}}}}}); 

我看,你不能使用兩個位置$ operators,並且你必須知道的第二個索引位置。但是,我想避免使用我想要刪除的嵌入字典的索引。

參考: 的MongoDB在你$pull對象拉

http://docs.mongodb.org/manual/reference/operator/update/pull/

回答

4

該關鍵字的值必須是您的目標陣列的路徑。這似乎工作:

db.test.update(
    {'one.two.three_id': 456}, 
    {$pull: {'one.$.two': {three_id: 456}}} 
); 

它看起來像$代表第一匹配陣列級別在這種情況下,指數因此它的工作即使我們穿越多個嵌套層匹配。

+0

感謝您的回答。我剛剛嘗試過,但我第100次獲得'$ err:不支持的投影選項:one。$。two,code:13097'我正在使用mongo shell進行測試。 –

+0

忽略我上面的評論。你的解決方案確實有效我再次嘗試了一次,並且失去了一段時間。大。 –

+0

學習筆記:我試圖使用一個簡單的查詢來縮短表達式,並得到以下消息:「不能應用位置運算符而沒有包含數組的相應查詢字段。」所以,查詢設置使用$運算符。 –

相關問題