MongoDB 聚合
生活随笔
收集整理的這篇文章主要介紹了
MongoDB 聚合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
聚合操作過程中的數據記錄和計算結果返回。聚合操作分組值從多個文檔,并可以執行各種操作,分組數據返回單個結果。在SQL COUNT(*)和group by 相當于MongoDB的聚集。
aggregate() 方法
對于在MongoDB中聚集,應該使用aggregate()方法。?
語法:
aggregate()?方法的基本語法如下
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)例子:
在集合中,有以下的數據:
{_id:ObjectId(7df78ad8902c)title:'MongoDB Overview', description:'MongoDB is no sql database',by_user:'yiibai point',url:'http://www.yiibai.com',tags:['mongodb','database','NoSQL'],likes:100},{_id:ObjectId(7df78ad8902d)title:'NoSQL Overview', description:'No sql database is very fast',by_user:'yiibai point',url:'http://www.yiibai.com',tags:['mongodb','database','NoSQL'],likes:10},{_id:ObjectId(7df78ad8902e)title:'Neo4j Overview', description:'Neo4j is no sql database',by_user:'Neo4j',url:'http://www.neo4j.com',tags:['neo4j','database','NoSQL'],likes:750},現在從上面的集合,如果想顯示一個列表,有很多用戶寫的教程,那么使用?aggregate()?方法,如下所示:
> db.mycol.aggregate([{$group :{_id :"$by_user", num_tutorial :{$sum :1}}}]){"result":[{"_id":"yiibai point","num_tutorial":2},{"_id":"yiibai point","num_tutorial":1}],"ok":1}>上述使用的情況相當于SQL查詢?select by_user, count(*) from mycol group by by_user
在上面的例子中,我們已分組字段 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 | 根據分組從源文檔中獲取的第一個文檔。通常情況下,這才有意義,連同以前的一些應用?“$sort”-stage. | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
| $last | 根據分組從源文檔中獲取最后的文檔。通常,這才有意義,連同以前的一些應用 “$sort”-stage. | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道概念
在UNIX?命令?shell?管道是指一些輸入和輸出作為輸入下一個命令等執行操作的可能性。 MongoDB 聚合框架也支持同樣的概念。有一組可能的階段,每個這些的一組文檔作為輸入,并產生一個結果集的文件(或最終生成的JSON文檔在管道末端)。然后又再次被用來為下一階段等。?
可能的階段聚合框架如下:
- $project:?用于選擇從收集的一些具體字段。
- $match:?這是一個濾波操作,因此可以減少量,作為下一階段的輸入給定的文檔。
- $group:?如上所討論的,這不實際的聚合。
- $sort:?文件排序。
- $skip:?與此有可能向前跳過的文件列表中的一個給定的的文檔數量。
- $limit:?這限制了的文檔數量看一下由從當前位置開始的給定數
- $unwind:?這是用來平倉文檔的中使用數組。使用數組時,數據是一種pre-joinded,再次有個別文件,此操作將被取消。因此,這個階段,數量會增加文件的下一階段。
總結
以上是生活随笔為你收集整理的MongoDB 聚合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给定任意字符串,计算一共能组合成多少个单
- 下一篇: java基础:数据类型