MongoDB 聚合嵌入的數組(扁平化數據+管道)

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 這個數組對象變成扁平的結構(把數組中的每個對象拆分出來與當前文檔重新組合,達到消數組的效果)

上面數據根據以下查詢語句的前後變化

扁平化前:

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 分好組了

關注公衆號,分享乾貨,討論技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章