You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两条MongoDB聚合查询为单条返回统计结果

MongoDB 双聚合查询合并优化方案

需求背景

现有两条可独立运行的MongoDB聚合查询,需要合并为单条查询,无需分两次执行、跨查询传参,即可一次性得到所需统计结果:

  • 第一条查询:统计section为A时,各sectionType对应的考试不及格总人数
  • 第二条查询:基于第一条返回的sectionType值,统计section为A时该sectionType下的总参考人数

原有查询代码

  1. 不及格人数统计查询
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}
    }
])
  1. 总参考人数统计查询
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:12:17