MongoDB 的聚集操作

聚合引言

聚集操作就是出來數據記錄並返回計算結果的操作。MongoDB提供了豐富的聚集操作,能夠檢測和執行數據集上的計算。運行在mongod上的數據聚集簡化了代碼和資源限制。

像查詢一樣,在Mongo的聚合操作使用collections作爲輸入,並返回一個或多個document作爲輸出。

聚合模式

  • 聚合管道

MongoDB2.2引入了一個新的聚合框架:聚合管道,這是基於數據處理管道概念的模型。文檔輸入一個多階段的管道並將文檔轉化爲一個聚合的結果。

最基本的管道階段提供了過濾器(Filters)來像查詢一樣操作,和文檔轉化(Document transformations)來修改輸出文檔的形式。

其他的管道提供了對特定字段分組和排序的工具,也有聚合數組內容的工具。並且,管道階段能對任務使用操作符,比如計算平均值或連接一個字符串。

管道使用MongoDB原生的操作提供了有效的數據聚合,也是MongoDB裏面一個理想的數據聚合方法。


上面帶有註釋的聚合操作管道操作,這個聚合管道有兩個階段: $match和$group


  • Map-Reduce

MongoDB也提供了map-reduce操作來執行聚合操作。一般的,map-reduce操作有兩個階段:Map階段來處理每個文檔併爲每個輸入文檔輸出一個或多個文檔,Reduce階段整合map操作的輸出。Map-reduce有一個可選的finalize階段,來爲結果做最終的修改。和其他聚合操作一樣,map-reduce指出了查詢條件來選擇輸入文檔並排序和限制結果。

Map-reduce使用自定義的javasript函數來執行map和reduce操作,以及可選的finalize操作。雖然自定義的javasript相對聚合管道提供了更大的靈活性,但一般map-reduce相對低效和複雜。

並且,map-reduce操作的輸出集合比集合管道的輸出極限大16M。

注:

從MongoDB2.4開始,特定的mongo shell函數和屬性不能被map-reduce操作使用。MongoDB2.4也提供了同時執行多個Javascript操作的支持。在MongoDB2.4之前,javascript代碼只能在單線程執行,這爲map-reduce的並行帶來困難。




  • 單一目的的聚合操作

對很多的常規單一目的的聚合操作(single purpose aggregation operation),MongoDB提供了特殊目的的數據庫命令。這些常規的聚合操作是:返回匹配文檔的數量,返回一個字段的唯一的值,和基於一個字段值的分組。所有這些操作都是來自一個collection。雖然這些操作提供了簡單的常規聚合操作處理方法,但他們都缺乏靈活性和像聚合管道、Map-reduce那樣的能力。




發佈了26 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章