天天看點

mongodb 聚合(aggregate)

  

   MongoDB中文手冊|官方文檔中文版 https://docs.mongoing.com/

  聚合操作處理資料記錄和 return 計算結果。聚合操作将來自多個文檔的值組合在一起,并且可以對分組資料執行各種操作以傳回單個結果。

   MongoDB 提供了三種執行聚合的方法:聚合管道,map-reduce function和單一目的聚合方法。

  管道使用MongoDB中的原生操作提供有效的資料聚合,并且是MongoDB中資料聚合的首選方法。

  一、聚合管道

  MongoDB 的Aggregation framework是以資料處理管道的概念為藍本的。文檔進入多階段管道,将文檔轉換為聚合結果。

  聚合(aggregate)主要用于計算資料,類似sql中的sum()、avg()

  文法:db.集合名稱.aggregate([{管道:{表達式}}])

  管道在MongoDB中一般用于将目前指令的輸出結果作為下一個指令的輸入

  常用管道

  1、$group:将集合中的文檔分組,可用于統計結果

  2、$match:過濾資料,隻輸出符合條件的文檔

  3、$project:修改輸入文檔的結構,如重命名、增加、删除字段、建立計算結果

  4、$sort:将輸入文檔排序後輸出

  5、$limit:限制聚合管道傳回的文檔數

  6、$skip:跳過指定數量的文檔,并傳回餘下的文檔

  7、$unwind:将數組類型的字段進行拆分

  表達式:處理輸入文檔并輸出

  文法:表達式:'$列名'

  常用表達式

  1、$sum:計算總和,$sum:1同count表示計數

  2、$avg:計算平均值

  3、$min:擷取最小值

  4、$max:擷取最大值

  5、$push:在結果文檔中插入值到一個數組中

  6、$first:根據資源文檔的排序擷取第一個文檔資料

  7、$last:根據資源文檔的排序擷取最後一個文檔資料

  $group

  将集合中的文檔分組,可用于統計結果,

  _id表示分組的依據,使用某個字段的格式為'$字段'

  例如:統計訂單表中每天訂單的數量:

  Group by null

  将集合中所有文檔分為一組

  求訂單總數

  透視資料

  統計detail10集合中,直播和視訊的标題

結果:

   $match

   用于過濾資料,隻輸出符合條件的文檔

   使用MongoDB的标準查詢操作

    例如,查詢name為央視新聞,日期為2020-10-08的記錄中每個tag值對應的記錄數量

   $project

   修改輸入文檔的結構,如重命名、增加、删除字段、建立計算結果

  $sort

  将輸入文檔排序後輸出

  查詢tag對應記錄數量,按統計數量升序

  結果:

  $limit

  限制聚合管道傳回的文檔數,

  例如傳回上面傳回結果2條記錄:

  $unwind

  文法1

  将文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值

  構造資料:

   文法2:

    對某字段值進行拆分,

    處理空數組、非數組、無字段、null情況

  使用文法1查詢

檢視查詢結果,發現對于空數組、無字段、null的文檔,都被丢棄了

如何能不丢棄呢?使用文法2