aggregate相似於pipe.拆分結果真後對結果進行分析求值而後再返回新結果..html
MongoDB聚合
官方API
MongoDB aggregate 運用篇 我的總結 - fycayy
案例一
案例二
案例三mongodb
那麼aggregate有什麼做用呢?舉個例子 testName文檔中有以下幾個集合數組
<!-- more -->ui
//集合一 { _id:1, list:[ {name:"x",age:11,sex:"boy"}, {name:"y",age:12,sex:"girl"}, {name:"z",age:13,sex:"boy"}, {name:"n",age:14,sex:"boy"}, ] } //集合二 { _id:2, list:[ {name:"q",age:15,sex:"boy"}, {name:"w",age:16,sex:"girl"}, {name:"e",age:17,sex:"girl"}, {name:"r",age:18,sex:"boy"}, ] } //集合三 { _id:3, list:[ {name:"a",age:19,sex:"girl"}, {name:"s",age:20,sex:"girl"}, {name:"d",age:21,sex:"girl"}, {name:"f",age:22,sex:"boy"}, ] }
咱們想篩選出list中sex爲boy的集合.理所固然咱們會這樣寫code
db.testName.find({"list":{"$elemMatch":{"sex":"boy"}}})
固然這樣寫是能拿到結果的.拿到的是什麼結果呢?結果會返回全部的sex=boy的集合,而且sex=girl的數據也包含在內.可是咱們只想要sex=boy的數據.這時候就能夠用聚合查詢了htm
db.testName.aggregate( {"$unwind":"$list"}, {"$match":{"list.sex":{"$eq":"boy"}}}, { "$group":{ "_id":"$_id", "results":{ "$push"{"name":"$list.name","age":"$list.age","sex":"$list.sex"} } } } )
okay,不要怕.咱們慢慢來分析 首先從$unwind來分析.$unwind會拆分數組元素拆分紅一個一個集合那麼這條參數執行後會獲得什麼結果呢?對象
{ _id:1, list:{name:"x",age:11,sex:"boy"}, } { _id:1, list:{name:"y",age:12,sex:"girl"}, } { _id:1, list:{name:"z",age:13,sex:"boy"}, } ...
會拆分紅一條條的臨時集合,這個臨時集合的名稱就是$list,這就至關於第一道工藝程序把數組拆分開.接下來交給第二道程序{"$match":{"list.sex":{"$eq":"boy"}}} 這條語句做用是啥呢?想必你們也知道了.就是對臨時的集合進行一個查詢,相似於db.$list.find(),那麼查詢到的確定就是sex=boy的數據了 如今返回的數據就是 不會有sex=girl的存在了ip
{ _id:1, list:{name:"x",age:11,sex:"boy"}, } { _id:1, list:{name:"z",age:13,sex:"boy"}, } ....
接下來就是要把這些組合在一塊兒,也就是第三道工藝程序文檔
{ "$group":{ "_id":"$_id", "results":{ "$push"{"name":"$list.name","age":"$list.age","sex":"$list.sex"} } } }
其實也很好理解,$group就是組合的意思,把這些零散的數據以咱們想要的形式組合起來.這個$_id指的就是臨時集合中的_id.那麼$list就是臨時集合中的list,以_id爲首把這些零散的list給組合成一個新的數組就是聚合.$push是添加一個對象,固然也有更簡單的方式get
{ "$group":{ "_id":"$_id", "results":{ "$push":"$list" } } }
這樣就直接把整個list對象給push到一個數組中.那麼這樣查詢最終返回的結果就是咱們想要的結果了