MongoDB 聚合嵌入的陣列(扁平化資料+管道)
阿新 • • 發佈:2019-01-06
先看下要操作的主要資料結構:
{
"_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 做資料的分組查詢
上面資料根據以下查詢語句的前後變化
扁平化前:
db.getCollection('topics').find({"teach_id":10010943})
扁平化後:
db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'})
關注扁平化前後 tips 由陣列變成了物件
通過 {'$unwind' : '$tips'} 對文件扁平化結構之後,然後再用 pipeline (管道)的方式做聚合就好了,
可以直接根據 tips._id 進行分組了
查詢語句:
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 分好組了