如果我理解正確的話,示例導致您分享:
{
user: ObjectId("52050d48e654f6342c002d42"),
send: 1,
open: 1,
click: 2
}
...需要做到以下幾點:通過1
- 遞增該用戶的
send
和open
領域,每。
- 比較後增量
open
/send
比(不存儲)與一些值,並設置一個布爾標誌上基於該比較的結果的用戶文檔。
在最好的情況,我想你可以預先彙總會收到類似的更新和問題multi-document updates其中_id
是值的陣列$in
用戶;但是,這仍然需要MongoDB爲每個用戶分別查詢。還有就是在$in
數組參數的大小的限制,但這一戰略的主要好處是,你的驅動程序和服務器之間發送更少的操作,您將收到一個GLE(即獲得最後一個錯誤)響應。
open
/send
比例計算將證明更加棘手,因爲這將需要從所有文檔中獲取這些字段。更新步驟後,你也許能夠發出對用戶採集第二聚集,並使用$divide
在這兩個領域來計算該值。然後,您可以在comparison operator中使用商和您的其他值。這將使您的工藝成爲僅包含用戶ID和布爾值的聚合結果。從那裏開始,您仍然需要從驅動程序發佈更多的更新語句,但將這些更新語句分組爲多文檔更新會簡單得多,因爲標誌字段只有兩個可能的值。
我肯定會建議讓標誌字段是一個總是存在的布爾值,因爲這可以讓你改變它的值,而不用擔心創建一個新字段,並且無意中要求文件在磁盤上移動,如果它超過了它的分配空間。只要有可能,你應該瞄準in-place updates。
最後,另外一個選擇尋找到與PHP驅動程序是write concern爲您更新操作。您可以通過使用0的寫入關注點來獲得一些性能(以錯誤檢查爲代價),因爲這可以讓您儘快將更新發送到MongoDB,而無需等待錯誤響應。
你提供的@verbumSapienti鏈接是完全無關的,你有沒有讀過問題? – 2013-08-21 14:54:16
不,這是用於mongo索引:) –