2012-07-04 9 views
0

我們有一個系統,我們希望將大量記錄信息的統計信息分成不同的通道,每個通道都有一個概覽文檔,其中包括Max以級聯方式顯示小時,天,月和年的最小值。在MongoDB中維護級聯的一組最大/最小統計數據的最佳方法

我們可以維護一個文檔來保存一個月的頻道統計數據,每個月有一個月最多/最少31個每日最多/每分鐘24小時最多分鐘。

使用文檔進行計數使用$ inc非常適合原子更新,更新修飾符上的$ max和$ min可以解決我們的問題,但不幸的是這是不可用的。

我們可以保持任務處理器中的最大值和最小值,併發出$ set,但是在系統中所有任務處理器(可能位於不同的機器上)上協調這些處理器時存在問題,所以我們決定將mongo保存爲主要參考。同樣的統計數據可能會由在不同任務處理器實例上同時運行的兩個獨立任務進行更新。

所以我們正在尋找的意見/最佳的解決方案建議(我們不一定會保持原始數據,所以後處理是不是一種選擇)

  1. 讀取,更新&每次我們需要時間節省更新?

  2. 使用db Eval執行JavaScript服務器端來更新max/man cascade只需傳入一個值?

  3. 還有別的辦法嗎?

非常感謝您的幫助。

回答

1

我認爲你正在尋找樂觀鎖定。您可以通過在文檔中存儲版本字段來確保更新是原子性的。請看下面的例子:

{_id: xyz, version: 2, max: 10} 

首先找到該文件:

db.example.find({_id:xyz}) 

商店的版本號,並確定(客戶端)的最大值是否需要更新。如果是這樣,

db.example.update({id:xyz, version: 2}, {$set: {max: 12}, $inc: {version: 1}}) 

如果版本的查詢和更新發生,從而防止併發相關的數據損壞的時間之間改變此更新將失敗。您可以使用getLastError來確定更新是否失敗,然後從第一步開始重試。

您應該避免使用db.eval(),因爲此操作需要全局鎖定。

的樂觀鎖定的其他資源可以在這裏找到: http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22 http://code.google.com/p/morphia/wiki/MongoNewsletterArticleDec2010

上併發MongoDB的文檔:http://www.mongodb.org/display/DOCS/How+does+concurrency+work

+0

由於詹娜這幾乎是我現在提出的確切解決方案,非常適合驗證!我在http://cookbook.mongodb.org/patterns/track_max_value_in_array/看到了單個最大值的解決方案,但是因爲我有多個字段可能使用FindAndModify的版本號或修訂版號進行更新,所以可以解決這個問題,非常感謝。 – DoodleWalker

相關問題