MongoDB按create_date分组聚合如何实现多条件计数
MongoDB 按日期分组后多条件统计实现方案
你现有聚合框架不需要做大的调整,直接在$group阶段追加条件计数逻辑即可,一次聚合就能同时返回总记录数和各筛选条件下的记录数。
核心实现方式
利用$group阶段的$cond条件运算符做条件累加:符合判断规则的文档记1,不符合的记0,通过$sum累加后直接得到对应条件的记录总数,不需要额外拆分查询或增加$match阶段,执行效率更高。
完整聚合代码
db.你的目标集合名.aggregate([ // 前置过滤阶段:保留你原有的筛选逻辑,提前缩小数据范围 { $match: { country_code: 1, create_date: { $gt: "2022-06-01" } } }, { $group: { _id: { datebasis: "$create_date" }, // 保留原有总记录数统计逻辑 TotalRecordscount: { $sum: 1 }, // 新增:统计scr_7day等于0的记录数 Scr7dayZeroCount: { $sum: { $cond: [ { $eq: [ "$scr_7day", 0 ] }, 1, 0 ] } }, // 新增:统计resolution_duration_minutes小于1440的记录数 ResolutionLt1440Count: { $sum: { $cond: [ { $lt: [ "$resolution_duration_minutes", 1440 ] }, 1, 0 ] } } // 其他统计规则按上述格式追加即可 } }, // 可选配置:按日期升序排列结果 { $sort: { "_id.datebasis": 1 } } ])
扩展规则说明
- 单条件判断直接使用比较运算符即可:等于用
$eq、小于用$lt、大于用$gt、不等于用$ne - 多条件组合判断可以用
$and/$or包裹多个规则,例如统计同时满足scr_7day=0且国家为US的记录数,判断条件写为:$cond: [ { $and: [ { $eq: ["$scr_7day", 0] }, { $eq: ["$country_code", "US"] } ] }, 1, 0 ] - 所有条件计数和总记录数在同一次分组计算中完成,不会出现计数口径不一致的问题
返回结果示例
/* 1 */ { "_id" : { "datebasis" : "2022-06-09" }, "TotalRecordscount" : 15478.0, "Scr7dayZeroCount" : 8921.0, "ResolutionLt1440Count" : 7245.0 } /* 2 */ { "_id" : { "datebasis" : "2022-06-14" }, "TotalRecordscount" : 16688.0, "Scr7dayZeroCount" : 9657.0, "ResolutionLt1440Count" : 8102.0 }
内容的提问来源于stack exchange,提问作者Gaurav Aggarwal
相关产品推荐
相关产品推荐

