如何在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" } } ])
步骤说明
$addFields阶段:通过$cond结合$and判断文档是否满足双YES条件,生成groupKey作为分组依据。$group阶段:以groupKey为分组键,统计每组的文档总数。$replaceRoot+$arrayToObject:将分组结果从{_id: "YES", count:2}的格式转换为{YES:2}。- 最后两个阶段:把多个分组文档合并成一个包含所有键值对的文档,得到期望的
{"YES":2,"NO":2}输出。
如果不需要合并成单个文档,仅保留前三个阶段即可,会输出两个独立文档:{YES:2}和{NO:2}。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

