MongoDB聚合查询需求:按日期统计发送/失败状态的邮件数量
问题排查与修正方案
你的聚合查询存在两个关键问题,导致无法得到预期的按日期统计Send/Failed状态邮件数量的结果:
- 未添加计数逻辑:仅通过
$group按日期和状态分组,但没有统计每个分组内的文档数量,最终只会返回分组的_id,看不到具体邮件数。 - 未过滤目标状态:没有筛选出仅状态为
Send或Failed的邮件,会将所有状态的邮件都纳入分组统计。
修正后的聚合查询
db.emails.aggregate([ // 第一步:只保留状态为Send或Failed的邮件 { "$match": { "sEmailStatus": { "$in": ["Send", "Failed"] } } }, // 第二步:按日期+状态分组,统计每组邮件数量 { "$group": { "_id": { "date": { "$dateToString": { "format": "%Y-%m-%d", "date": "$createdAt" } }, "status": "$sEmailStatus" }, "count": { "$sum": 1 } // 统计每个分组的文档数量 } }, // 可选:按日期排序,让结果更直观 { "$sort": { "_id.date": 1 } } ])
各阶段说明
$match阶段:通过$in操作符筛选出状态为Send或Failed的邮件,减少后续分组的数据量,提升查询效率。$group阶段:_id同时包含格式化后的日期(%Y-%m-%d)和邮件状态,确保每个日期下的不同状态各自分组。count字段用$sum:1统计每个分组内的文档数量,每匹配到一个文档就累加1。
$sort阶段:按日期升序排列结果,方便查看时间维度的趋势(可选,根据需求调整排序方向)。
内容的提问来源于stack exchange,提问作者Rajat Agarwal
相关产品推荐
相关产品推荐

