2013-08-21 60 views
0

我有一個很大的總量,其中總結了一些活動對每個用戶(集合內)。 該彙總返回數百萬個結果(每個用戶活動)。這種格式:如何獨立更新數百萬個文檔? PHP +蒙戈

Array ([_id] => Array ([user] => 
     MongoId Object ([$id] => 52050d48e654f6342c002d42) 
     [send] => 1 
     [open] => 1 
     [click] => 2) 

現在我需要做的幾件事情:

  • 更新用戶與這些結果(提高現有值)
  • 更新計算,平均每個用戶後(打開/發送)
  • 每個平均水平進行比較以數字,並根據結果添加一個標誌給用戶?

如何通過彙總更新用戶的這些結果而不循環並更新每次更新用戶?

+0

你提供的@verbumSapienti鏈接是完全無關的,你有沒有讀過問題? – 2013-08-21 14:54:16

+0

不,這是用於mongo索引:) –

回答

0

如果我理解正確的話,示例導致您分享:

{ 
    user: ObjectId("52050d48e654f6342c002d42"), 
    send: 1, 
    open: 1, 
    click: 2 
} 

...需要做到以下幾點:通過1

  • 遞增該用戶的sendopen領域,每。
  • 比較後增量open/send比(不存儲)與一些值,並設置一個布爾標誌上基於該比較的結果的用戶文檔。

在最好的情況,我想你可以預先彙總會收到類似的更新和問題multi-document updates其中_id是值的陣列$in用戶;但是,這仍然需要MongoDB爲每個用戶分別查詢。還有就是在$in數組參數的大小的限制,但這一戰略的主要好處是,你的驅動程序和服務器之間發送更少的操作,您將收到一個GLE(即獲得最後一個錯誤)響應。

open/send比例計算將證明更加棘手,因爲這將需要從所有文檔中獲取這些字段。更新步驟後,你也許能夠發出對用戶採集第二聚集,並使用$divide在這兩個領域來計算該值。然後,您可以在comparison operator中使用商和您的其他值。這將使您的工藝成爲僅包含用戶ID和布爾值的聚合結果。從那裏開始,您仍然需要從驅動程序發佈更多的更新語句,但將這些更新語句分組爲多文檔更新會簡單得多,因爲標誌字段只有兩個可能的值。

我肯定會建議讓標誌字段是一個總是存在的布爾值,因爲這可以讓你改變它的值,而不用擔心創建一個新字段,並且無意中要求文件在磁盤上移動,如果它超過了它的分配空間。只要有可能,你應該瞄準in-place updates

最後,另外一個選擇尋找到與PHP驅動程序是write concern爲您更新操作。您可以通過使用0的寫入關注點來獲得一些性能(以錯誤檢查爲代價),因爲這可以讓您儘快將更新發送到MongoDB,而無需等待錯誤響應。