MongoDB提供了三種執行聚合操作的方法:聚合管道、map-reduce函數和單用途聚合方法。
MongoDB聚合操作在邏輯上是在數據處理管道上建模的。文檔可以進入多級管道來處理文檔,然後返回聚合值。
底層管道提供過濾器(類似於查詢操作)和文檔轉換(修改文檔的輸出形式)操作。
其他管道操作為文檔指定特定屬性或多個屬性進行分組和排序,就像數組內容的聚合工具壹樣。管道的階段可以使用操作符來執行任務。
管道使用MongoDB自己的本地操作進行聚合操作效率更高,管道是MongoDB中最先進行聚合操作的。
聚合管道可以操作碎片收集。聚合管道可以通過使用索引來提高性能。優化階段將在聚合管道內進行。
可以通過使用db.collection.aggregate()的explain參數來查看執行計劃。
聚合管道以確定需要返回哪些字段。如果只使用需要的字段,可以減少數據量。
AddFields+match放在AddFields之前(如果是project/$addFields的結果,不能移動)以減少數據量。
Match:首先執行$match減少數據量,然後執行排序操作。
Match:如果在前面加壹個$match操作,可以使用索引來減少數據操作。
跳過(從3.2開始可用):可以在操作project之前減少數據量。
通常,在重新排序優化之前,階段合並不會發生。
極限:如果數據量不能減少,兩個階段不會合並。否則,先排序,然後獲取指定的數量並放入內存。如果中間有$skip操作,放在最後。
當數據量超過內存限制時,該操作需要設置allowDiskUse=true。
從MongoDB3.6開始,aggregate選項被刪除,結果作為壹段數據返回。
Aggregate可以返回遊標或數據結果集。在返回的結果中,每個文檔的大小不能超過16M(此限制僅適用於返回的文檔)。
文檔可能會超過這個限制,db.collection.aggregate()默認返回cursor。
從MongoDB2.6開始,流水線階段的RAM限制為100M m..如果超過限制,就會發生錯誤。如果要處理大量數據集,請使用allowDiskUse選項在管道階段啟動聚合操作,並將數據寫入臨時文件。
從MongoDB3.4開始,graphLookup操作將忽略該選項。如果其他階段有aggregate()操作,allowDiskUse=true將影響這些階段。
從MongoDB3.2開始,如果按照切片匹配值,只會在這個切片中計算。
聚合操作在多個切片上執行。如果未指定主切片,這些操作將被路由到其他切片,以減少主切片的負載。
查找階段需要在主圖塊上執行查詢。
將聚合管道分成兩部分,以便對切片執行優化。
操作可以參考例子。
MapReduce可以對切片執行操作,切片集可以用作輸入或輸出。
使用瓦片集作為MapReduce的輸入源,mongos並行地將作業分派給每個瓦片。Mongos會等待所有的作業完成。
如果MapReduce的out字段有壹個碎片值,MongoDB使用_id字段作為碎片的基礎。
作為片段集輸出:
在操作過程中,mapreduce有許多鎖:
相關實踐教程