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

如何在MongoDB聚合$group中按条件统计双check字段结果?

问题

我有一个集合,其中文档包含checks子文档(含check1、check2字段),需通过MongoDB聚合的$group操作实现分组统计:将check1和check2均为YES的文档归为YES组,其余归为NO组,期望输出为{"YES":2,"NO":2}。目前已有部分$group代码,求正确的聚合写法。

集合数据示例

const mongodocs = [
  {
    checks: {
      check1: "YES",
      check2: "NO"
    }
  },
  {
    checks: {
      check1: "YES",
      check2: "YES"
    }
  },
  {
    checks: {
      check1: "NO",
      check2: "YES"
    }
  },
  {
    checks: {
      check1: "YES",
      check2: "YES"
    }
  }
]

现有代码片段

{
  $group: {
    _id: { YES: { check1: "$checks.check1", check2: "$checks.check2" } }, // 需添加条件:仅当check1和check2均为YES时计入YES组
    count: { $sum: 1 },
  },
}

正确聚合写法

需要先生成一个统一的分组标识字段,再基于该字段分组统计,最后转换为期望的键值对格式,完整聚合管道如下:

db.collection.aggregate([
  // 生成分组标识:双check均为YES则标记为YES,否则为NO
  {
    $addFields: {
      groupKey: {
        $cond: {
          if: { $and: [
            { $eq: ["$checks.check1", "YES"] },
            { $eq: ["$checks.check2", "YES"] }
          ]},
          then: "YES",
          else: "NO"
        }
      }
    }
  },
  // 按分组标识统计数量
  {
    $group: {
      _id: "$groupKey",
      count: { $sum: 1 }
    }
  },
  // 转换为{组名: 数量}的格式
  {
    $replaceRoot: {
      newRoot: { $arrayToObject: [[{ k: "$_id", v: "$count" }]] }
    }
  },
  // 合并所有分组结果为单个文档
  {
    $group: {
      _id: null,
      result: { $mergeObjects: "$$ROOT" }
    }
  },
  {
    $replaceRoot: { newRoot: "$result" }
  }
])

步骤说明

  1. $addFields阶段:通过$cond结合$and判断文档是否满足双YES条件,生成groupKey作为分组依据。
  2. $group阶段:以groupKey为分组键,统计每组的文档总数。
  3. $replaceRoot+$arrayToObject:将分组结果从{_id: "YES", count:2}的格式转换为{YES:2}。
  4. 最后两个阶段:把多个分组文档合并成一个包含所有键值对的文档,得到期望的{"YES":2,"NO":2}输出。

如果不需要合并成单个文档,仅保留前三个阶段即可,会输出两个独立文档:{YES:2}和{NO:2}。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:05:26