如何在MongoDB Aggregation中按条件统计文档数量 无匹配时返回0
MongoDB按分类组合统计匹配数组字段的文档量
需求说明
获取去重的categoryCode和categoryName组合,统计每个组合下匹配cat数组内指定type值的文档数量,无匹配文档的分类组合也需要在结果中返回,对应cat_count值为0。
示例数据
[ { "cat_id":1, "categoryCode":"categoryCode1", "categoryName":"categoryName1", "cat":[ {"type":"A"}, {"type":"B"}, {"type":"C"} ] }, { "cat_id":2, "categoryCode":"categoryCode1", "categoryName":"categoryName1", "cat":[{"type":"A"}] }, { "cat_id":3, "categoryCode":"categoryCode2", "categoryName":"categoryName2", "cat":[{"type":"C"}] }, { "cat_id":4, "categoryCode":"categoryCode3", "categoryName":"categoryName3", "cat":[{"type":"A"}] } ]
预期输出(匹配type='A'场景)
[ { "categoryCode":"categoryCode1", "categoryName":"categoryName1", "cat_count": 2 }, { "categoryCode":"categoryCode2", "categoryName":"categoryName2", "cat_count": 0 }, { "categoryCode":"categoryCode3", "categoryName":"categoryName3", "cat_count": 1 } ]
错误查询分析
原查询直接用$eq比较$cat.type和字符串,由于$cat.type返回的是当前文档cat数组下所有type值组成的数组,和字符串直接匹配永远不成立,导致统计结果错误:
db.collection.aggregate([ { "$group":{ "_id":{ "categoryCode":"$categoryCode", "categoryName":"$categoryName" }, "catCount":{ "$sum":{ "$cond":{ "if":{"$eq":["$cat.type","A"]}, "then":1, "else":0 } } } } }, { "$project":{ "categoryCode":"$_id.categoryCode", "categoryName":"$_id.categoryName", "catCount":1, "_id":0 } } ])
正确解决方案
使用$in运算符判断目标type值是否存在于$cat.type返回的数组中即可:
db.collection.aggregate([ { "$group":{ "_id":{ "categoryCode":"$categoryCode", "categoryName":"$categoryName" }, "cat_count":{ "$sum":{ "$cond":{ "if":{"$in": ["A", "$cat.type"]}, "then": 1, "else": 0 } } } } }, { "$project":{ "categoryCode":"$_id.categoryCode", "categoryName":"$_id.categoryName", "cat_count": 1, "_id": 0 } } ])
内容的提问来源于stack exchange,提问作者prabhakar srivastava
相关产品推荐
相关产品推荐

