如何合并两条MongoDB聚合查询为单条返回统计结果
MongoDB 双聚合查询合并优化方案
需求背景
现有两条可独立运行的MongoDB聚合查询,需要合并为单条查询,无需分两次执行、跨查询传参,即可一次性得到所需统计结果:
- 第一条查询:统计
section为A时,各sectionType对应的考试不及格总人数 - 第二条查询:基于第一条返回的
sectionType值,统计section为A时该sectionType下的总参考人数
原有查询代码
- 不及格人数统计查询
db.Departments.aggregate([ { $match: {$and: [{"subject.failed": {$eq: 'true'}}, {"section": {$eq: 'A'}}]} }, { $group: { _id: {"sectionType": "$sectionType"}, "COUNT(*)": {$sum: 1} } }, { $project: {"totalFailed": "$COUNT(*)", "$sectionType": "$_id.$sectionType", "_id": 0} } ])
- 总参考人数统计查询
db.Departments.aggregate([ { $match: {$and: [{"sectionType": {$eq: 'Section Type From the Previous query result'}}, {"section": {$eq: 'A'}}]} }, { $group: { _id: null, "COUNT(*)": {$sum: 1} } }, { $project: {"totalCount": "$COUNT(*)", "_id": 0} } ])
测试数据说明
共3条section=A、sectionType=typeA的测试文档:
- 2条文档的
subject数组中存在failed="true"的记录 - 1条文档的
subject为空数组
预期合并后单次查询直接返回totalFailed=2、totalCount=3的统计结果。
合并后单条聚合查询
核心思路是在分组阶段通过条件累加器同时计算两个统计指标,无需两次查询、跨阶段传参,执行效率更高:
db.Departments.aggregate([ // 第一步:过滤所有section为A的文档,缩小数据处理范围 { $match: { section: "A" } }, // 第二步:按sectionType分组,同时统计总参考人数、不及格人数 { $group: { _id: "$sectionType", // 总参考人数:分组内所有文档直接计数 totalCount: { $sum: 1 }, // 不及格人数:仅累加subject数组中存在failed=true的文档 totalFailed: { $sum: { $cond: [ { $in: ["true", "$subject.failed"] }, 1, 0 ] } } } }, // 第三步:调整输出字段结构,移除默认_id字段 { $project: { _id: 0, sectionType: "$_id", totalFailed: 1, totalCount: 1 } } ])
执行结果验证
针对提供的3条测试数据,上述查询执行后返回结果如下,完全匹配预期:
{ "totalFailed": 2, "totalCount": 3, "sectionType": "typeA" }
内容的提问来源于stack exchange,提问作者Alex Man
相关产品推荐
相关产品推荐

