MongoDB 的聚集操作

jopen 10年前發布 | 44K 次閱讀 MongoDB NoSQL數據庫

聚合引言

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

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

聚合模式

  • 聚合管道
  • </ul>

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

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

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

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

    dq1.png

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


    • Map-Reduce
    • </ul>

      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的并行帶來困難。


      d2.png


      • 單一目的的聚合操作
      • </ul>

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

        d3.png

        來自:http://blog.csdn.net/chenloveit/article/details/38086765

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!