2014-01-09 85 views
2

例如,我有這樣的結構:MongoDB的繼續拉從當前文檔

> db.test.find().pretty() 
{ 
    "_id" : ObjectId("52ce7b49074b355233e6e2fb"), 
    "gifts" : [ 
     { 
      "gid" : "lala", 
      "reserv" : [ 
       555, 
       666 
      ] 
     }, 
     { 
      "gid" : "bebe", 
      "reserv" : [ 
       888, 
       555 
      ] 
     } 
    ], 
    "uid" : 123 
} 

我想拉「555」所有「RESERV」,並從「UID」和「RESERV」的內容的所有文件:

1)這個查詢查找第一個555,並把它的,但第二個555文件不拉:

db.test.update({uid : 123, 'gifts.reserv': 555}, {'$pull' : {'gifts.$.reserv' : 555}}, {multi : true}) 

2)該查詢沒什麼事:

db.test.update({uid : 123, 'gifts.reserv': 555}, {'$pull' : {'gifts.reserv' : 555}}, {multi : true}) 

所以我不能繼續更新上次更新文檔。

如何解決這個問題?

回答

1

恐怕這是不可能的。你可以做的最好的事情是:

  • 做你的收藏找到你想要的文件。在文檔
  • ,算上具有reserv555
  • 執行的次數update + pull這一數額的禮品金額。
+0

因此,我認爲這是「秒殺」。 更好的決定是重建集合來展開禮物數組或爲gifts.reserv進行單獨收集。 – Logioniz

+0

「秒殺」是什麼意思? – rednaw

+0

這個問題的錯誤決定。 – Logioniz

0

multi在這裏沒有效果,因爲Setting multi爲true會查看多個文檔,但這裏在多個子文檔中會出現相同的值。所以你需要操作子文件。

所以你應該嘗試這樣的事情。

while(db.test.find({uid : 123,'gifts.reserv':555}).count()!=0) 
{ 
    db.test.update(
     {uid : 123,'gifts.reserv':555}, 
     {$pull:{'gifts.$.reserv':555}} 
    ) 
} 
+0

不錯,你可以在一個命令中做到這一點,但是,我想知道如果這會發生在很多子文檔上,這是否有效,因爲它會執行'db.test.find({uid:123,'gifts。 reserv':555})。count()'每次。 – rednaw