MongoDB 中聚合(aggregate)主要用于處理資料(諸如統計平均值,求和等),并傳回計算後的資料結果。
有點類似 SQL 語句中的 count(*)。
MongoDB中聚合的方法使用aggregate()。
aggregate() 方法的基本文法格式如下所示:
集合中的資料如下:
現在我們通過以上集合計算每個作者所寫的文章數,使用aggregate()計算結果如下:
以上執行個體類似sql語句:
在上面的例子中,我們通過字段 by_user 字段對資料進行分組,并計算 by_user 字段相同值的總和。
下表展示了一些聚合的表達式:
表達式
描述
執行個體
$sum
計算總和。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg
計算平均值
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min
擷取集合中所有文檔對應值得最小值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max
擷取集合中所有文檔對應值得最大值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push
将值加入一個數組中,不會判斷是否有重複的值。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet
将值加入一個數組中,會判斷是否有重複的值,若相同的值在數組中已經存在了,則不加入。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first
根據資源文檔的排序擷取第一個文檔資料。
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last
根據資源文檔的排序擷取最後一個文檔資料
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
管道在Unix和Linux中一般用于将目前指令的輸出結果作為下一個指令的參數。
MongoDB的聚合管道将MongoDB文檔在一個管道處理完畢後将結果傳遞給下一個管道處理。管道操作是可以重複的。
表達式:處理輸入文檔并輸出。表達式是無狀态的,隻能用于計算目前聚合管道的文檔,不能處理其它的文檔。
這裡我們介紹一下聚合架構中常用的幾個操作:
$project:修改輸入文檔的結構。可以用來重命名、增加或删除域,也可以用于建立計算結果以及嵌套文檔。
$match:用于過濾資料,隻輸出符合條件的文檔。$match使用MongoDB的标準查詢操作。
$limit:用來限制MongoDB聚合管道傳回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,并傳回餘下的文檔。
$unwind:将文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
$group:将集合中的文檔分組,可用于統計結果。
$sort:将輸入文檔排序後輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
1、$project執行個體
這樣的話結果中就隻還有_id,tilte和author三個字段了,預設情況下_id字段是被包含的,如果要想不包含_id話可以這樣:
2.$match執行個體
$match用于擷取分數大于70小于或等于90記錄,然後将符合條件的記錄送到下一階段$group管道操作符進行處理。
3.$skip執行個體
經過$skip管道操作符處理後,前五個文檔被"過濾"掉。