2011-04-27 76 views
7

實時聚集在探索如何做MongoDB的實時分析,似乎是做算術相當標準的方法,但沒有更復雜的聚集方面。有些事情已經幫助...策略MongoDB中

做資金的基本方法是,以原子爲進來的每個新的紀錄,增量文件的密鑰緩存常用查詢:

Stats.collection.update({"keys" => ["a", "b", "c"]}, {"$inc" => {"counter_1" => 1, "counter_2" => 1"}, "upsert" => true); 

這不除了總和以外的其他彙總工作。我的問題是,可以這樣做的平均值,,和max在mongodb?

說你有一個這樣的文件:

{ 
    :date => "04/27/2011", 
    :page_views => 1000, 
    :user_birthdays => ["12/10/1980", "6/22/1971", ...] # 1000 total 
} 

你能做到這一點分組的生日弄成這樣一些原子或優化/實時操作?

{ 
    :date => "04/27/2011", 
    :page_views => 1000, 
    :user_birthdays => ["12/10/1980", "6/22/1971", ...], # 1000 total 
    :average_age => 27.8, 
    :age_rank => { 
    "0 to 20" => 180, 
    "20 to 30" => 720, 
    "30 to 40" => 100, 
    "40 to 50" => 0 
    } 
} 

...就像你可以做Doc.collection.update({x => 1}, {"$push" => {"user_birthdays" => "12/10/1980"}})的東西添加到一個數組,而不必加載文檔,你可以做這樣的事情,以平均/聚合數組?有沒有什麼東西可以用於實時聚合?

的MapReduce是用來做這在批處理作業,我在尋找模式的東西,如實時的map-reduce爲:

  1. 平均值:每次推新項目的時間在MongoDB的數組,什麼是實時進行平均的值的最佳方式是什麼?
  2. 分組:如果你10歲支架組的年齡,和你有一個年齡數組,你怎麼可以優化更新計數對於每個組你與新時代的更新文件?說年齡陣列將不斷推/拉。
  3. 最小值/最大值:有一些什麼方法來計算和存儲文檔中年齡陣列的最小/最大?

回答

4

你能做到這一點分組的生日弄成這樣一些原子或優化/實時操作?

看起來您已添加兩個字段age_rank,average_age。這些都是根據您已擁有的數據有效計算的字段。如果我給你帶頁面瀏覽量和用戶生日的文件,它應該是在客戶端代碼中查找最小/最大,平均真是小巫見大巫等

在我看來,你問MongoDB的執行爲你服務器端聚合。但是你添加了你不想使用Map/Reduce的限制?

如果我正確理解你的問題,你正在尋找的東西,你可以說「將該產品添加到一個數組中,並有所有相關項目進行自我更新」?你不希望讀者執行任何邏輯,你希望一切都在服務器端「神奇地」發生。

因此,有解決這一三種不同的方式,但其中只有一個是當前可用:

  1. 寫這個邏輯客戶端。這聽起來不像你想要的解決方案,但它會起作用。如果你有基礎數據,在大多數語言中做max/min/med/avg應該是相當平凡的。
  2. 利用Aggregation的即將發佈的功能。這些不在1.9.x之前安排。改進的聚合將允許提取您正在查找的數據,但是,您仍然必須編寫適當的查詢。底層數據庫仍然不包含您正在查找的數據。
  3. 您需要triggers。如果您確實希望數據庫始終保持一致幷包含彙總數據,那麼這就是您所需要的。但是,觸發器功能尚不存在。

不幸的是,你現在唯一的選擇是#1。幸運的是,我知道一些成功使用選項#1的人。