MongoDB按日期分组聚合:带条件$sum计算问题求助
解决MongoDB按日期分组统计状态及销售额的问题
我来帮你搞定这个聚合查询的问题!你的核心需求是按日期分组,统计不同状态的记录数以及对应状态的销售额总和,原来的代码主要有两个问题:一是没有用条件判断来精准计算符合状态的数量和销售额,二是分组仅用了dayOfMonth,容易导致不同月份的同一天被错误合并。
正确的聚合管道代码
db.collection.aggregate([ { $group: { // 按年-月-日分组,确保同一天的记录归为一组 _id: { year: { $year: "$createdAt" }, month: { $month: "$createdAt" }, day: { $dayOfMonth: "$createdAt" } }, // 取当天最早的记录时间作为结果里的createdAt createdAt: { $min: "$createdAt" }, // 统计active状态的记录数 active: { $sum: { $cond: [{ $eq: ["$status", "active"] }, 1, 0] } }, // 统计inactive状态的记录数 inactive: { $sum: { $cond: [{ $eq: ["$status", "inactive"] }, 1, 0] } }, // 统计active状态的销售额总和 salesOfActive: { $sum: { $cond: [{ $eq: ["$status", "active"] }, "$sale", 0] } }, // 统计inactive状态的销售额总和 salesOfInactive: { $sum: { $cond: [{ $eq: ["$status", "inactive"] }, "$sale", 0] } } } }, // 调整输出格式,移除默认的_id字段 { $project: { _id: 0, createdAt: 1, active: 1, inactive: 1, salesOfActive: 1, salesOfInactive: 1 } } ])
代码解释
- 分组逻辑:用
year+month+day作为分组的_id,避免不同月份的同一天被合并;同时用$min获取当天最早的createdAt,和你期望的结果格式匹配。 - 条件统计:使用
$cond操作符实现条件判断:- 统计记录数时,符合状态返回1,否则返回0,再用
$sum累加总数; - 统计销售额时,符合状态返回对应的
$sale值,否则返回0,再用$sum累加总和。
- 统计记录数时,符合状态返回1,否则返回0,再用
- 格式调整:通过
$project阶段移除自动生成的_id字段,输出你需要的所有字段。
运行结果
针对你提供的示例数据,运行上述聚合后会得到完全符合预期的结果:
[ { "createdAt": "2019-10-08 02:01:19", "active": 1, "inactive": 2, "salesOfActive": 4, "salesOfInactive": 10 } ]
内容的提问来源于stack exchange,提问作者Abtisam Ahmed
相关产品推荐
相关产品推荐

