2015-02-09 76 views
0

我有這樣的MongoDB集合:的MongoDB:拉完整密鑰:陣列對

{ 
    date: date, 
    domain: domain, 
    visitors: [ {owner:owner, ip:ip, views:views} ] 
} 

現在我想以檢查日期與日期和域等於域應該刪除整個遊人陣列,例如:

collection.update({"date":date, {"domain":domain} {"$pull":{"visitors"}}) 

如何使這項工作?

回答

1
db.test.update({"$and": [{date:"date"}, {domain:"domain"}]}, {"$set":{visitors:[]}}) 

你SH應該使用$and operator來匹配您的更新查詢。

從陣列中刪除所有元素與將遊客值設置爲空陣列[ ]相同。但是將它設置爲空數組更快,更容易編寫和理解,所以您應該使用它。

+1

'$和'在這裏不需要,因爲多個查詢項已經隱含地與「與」了。只需使用'{date:date,domain:domain}'。 – JohnnyHK 2015-02-09 15:45:13

+0

是的,但是他的匹配也是錯誤的,我認爲如果你稍後改變了你的查詢,更容易更新和理解,那麼首先使用'$和'是很好的。 – Simulant 2015-02-09 15:59:04

+2

我遇到了不必要的'$和'使用阻止查詢優化器使用「正確」索引的情況,所以我學會了在實際需要時才使用它。 – JohnnyHK 2015-02-09 16:07:45

2

你可以嘗試使用$set操作清空遊客陣列,而不是通過使用$pull運營商,這將是更快的$pull刪除所有項目必須做對數組的計算:

db.collection.update({"date": date, "domain": domain}, { $set : {"visitors": [] }} , {multi: true}) 

等效$pull操作將

db.collection.update({"date": date, "domain": domain}, { $pull : { "visitors": {} }}, {multi: true}) 
+1

感謝您的補充說明。 – nottinhill 2015-02-09 15:06:40

+0

@SirBenBenji不用擔心,很高興你覺得它有用。 – chridam 2015-02-09 15:08:34

+0

您的'$ pull:{「visitors」:{}}'不適用於我。 – Simulant 2015-02-09 15:57:01