MongoDB $group聚合如何带条件取status为true的最小dateModified值
MongoDB 分组聚合实现条件最小值与全量计数方案
需求说明
需要按name字段完成分组聚合,同时实现两类统计逻辑:
- 仅取分组内
status为true的文档中dateModified字段的最小值 - 统计分组下所有文档(包含
status: true、status: false)的总条数,不可在$group阶段前使用$match: {status: true}过滤,否则会丢失非true状态的文档导致总条数统计错误
问题复现
现有测试数据:
[ {name: "one", dateModified: "4", status: true}, {name: "one", dateModified: "2", status: false}, {name: "one", dateModified: "3", status: true} ]
初始错误聚合写法:
.aggregate([ { $group: { _id: "$name", date: {$min: "$dateModified"}, // 此处会统计所有文档的最小值,不符合要求 total: {$sum: 1} } } ])
上述写法执行后date字段返回值为2,但预期返回status: true文档中的最小dateModified值3,同时需要保留全量文档的计数结果。
正确实现方案
在$group阶段使用$cond条件运算符控制参与$min计算的值:当status为true时传入dateModified值,否则传入null,$min运算符会自动忽略null值,不会影响最小值计算,同时$sum:1可以正常统计全量文档数。
完整聚合代码:
db.你的集合名.aggregate([ { $group: { _id: "$name", date: { $min: { $cond: [ { $eq: ["$status", true] }, "$dateModified", null ] } }, total: { $sum: 1 } } } ])
执行结果
针对给出的测试数据,执行后返回结果符合预期:
[ { _id: "one", date: "3", total: 3 } ]
注:该写法兼容
dateModified为字符串、数值、日期类型的场景,比较逻辑与原生$min完全一致。
内容的提问来源于stack exchange,提问作者succeed
相关产品推荐
相关产品推荐

