天天看點

MongoDB 聚合

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管道操作符處理後,前五個文檔被"過濾"掉。