在mongodb中想要完成彙總操作,可以使用以下三種方式;但是很多時候這三個真是傻傻分不清楚,本文是來總結以下三種方式的區別滴~
1. 彙總架構aggregate pipeline
2. mapreduce
3. 彙總命令group,distinct,count
彙總架構 aggregate pipeline(彙總管道)
aggregate 彙總架構是基於資料處理管道模型建立的,文檔通過多級管道將會輸出彙總結果;aggregate管道彙總方案使用的是mongodb內建的匯總操作,相對來說更為高效,在做mongodb資料彙總操作的時候優先推薦aggregate;
aggregate能夠通過索引來提升效能,並且有一系列的管道效能最佳化操作這個最佳化總結另有文章描述;
總的來說aggregate管道操作有點像unix 系統內的管道操作,將當前文檔進入第一個管道節點處理完成後再丟給第二個管道節點,舉例子如下:
aggregate的限制
1.當aggregate返回的結果集(指標或者結果集),當結果集中的單個文檔超過16 MB命令會報錯;該限制只適用於返回的結果集文檔,在管道處理文檔的過程中,這個文檔很有可能會超過16MB;
2.如果使用aggregate不指定遊標選項或儲存集合中的結果,aggregate命令返回一個包涵於結果集的欄位中的bson檔案。如果結果集的總大小超過bson檔案大小限制(16MB)該命令將產生錯誤;
3.管道處理階段有記憶體限制最大不能超過100MB,超過這個限制會報錯誤;為了能夠處理更大的資料集可以開啟allowDiskUse選項,可以將管道操作寫入臨時檔案;
使用情境:
1.用於常用彙總操作
2.對彙總響應效能需要一定要求時(索引及組合最佳化)
3.aggregate 管道操作是在記憶體中完成的,有記憶體大小限制,處理資料集大小有限;
Mapreduce
Map-reduce是處理彙總計算的另外一個方式;Map-reduce一般有兩個階段:一個階段是處理單個文檔,另一個階段是將處理完的當前文檔返回一個或者多個對象進入下一個文檔處理方法中;
額....好繞,簡單來說就是reduce文檔結果集,通過reduce函數進行匯總;
reduce不用我來解釋吧。
Map-reduce使用慣用的javascript操作來做map和reduce操作,因此Map-reduce的靈活性和複雜性都會比aggregate pipeline更高一些,並且相對aggregate pipeline而言更消耗效能;
使用情境:
1.因為使用javascript靈活度高的特點,可以處理複雜彙總需求;
2.使用於處理大資料結果集
詳細使用說明看這裡MongoDB Mapreduce詳細操作總結 單獨的彙總命令(group,distinct,count)
一句話,比aggregate效能低,比Map-reduce靈活度低;但是可以節省幾行javascript代碼,後面那句話我自己加的,哈哈哈~
Group操作:mongodb2.2版本對於返回資料最多隻包涵20000個元素,最多支援20000獨立分組;對於超過20000的獨立分組建議採用mapreduce;
Count操作:db.collection.count()等效於db.collection.find().count(),在分布式集合中,會出現計算錯誤的情況,這個時候推薦使用aggregate;
Distinct操作:可以使用索引;
作者:小直
連結:http://www.jianshu.com/p/e1043d9070ea
來源:簡書