MongoDB學習教程git
先看下要操做的主要數據結構:mongodb
{ "_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0", "evaluation_type" : 2, "reply_count" : 5, "type" : 3, "content" : "怎麼編制餘額調節表", "tips" : [ { "_id" : 1000, "tip_name" : "會計基礎" } ], "teach_id" : 10298153 }
看這個文檔數據,如今要以 tips 數組下的 _id 作數據的分組查詢。在查詢條件中使用 "tips.0._id":1000 過濾數據是能夠生效的,但用在 aggregate 聚合查詢中的 group 分組條件中是不行的,必須得先使用 $unwind (文檔地址)把 tips 這個數組對象變成扁平的結構(把數組中的每一個對象拆分出來與當前文檔從新組合,達到消數組的效果)數組
上面數據根據如下查詢語句的先後變化數據結構
扁平化前:app
db.getCollection('topics').find({"teach_id":10010943})
扁平化後:ide
db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'})
關注扁平化先後 tips 由數組變成了對象學習
經過 {'$unwind' : '$tips'} 對文檔扁平化結構以後,而後再用 pipeline (管道)的方式作聚合就行了,lua
能夠直接根據 tips._id 進行分組了spa
查詢語句:code
db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'}, {'$group':{'_id':{"tipId":'$tips._id',"tipName":'$tips.tip_name',"evaluationType":'$evaluation_type'},"count":{'$sum': 1}}}, {'$project':{"tipId":'$_id.tipId',"tipName":'$_id.tipName',"evaluationType":'$_id.evaluationType',"count":'$count'}})
完美滴根據 tipId,tipName,evaluationType 分好組了