MongoDB统计isFree字段true和false数量聚合查询结果异常排查
问题原因
你的聚合语句存在两处错误:
- 引用字段时未加
$前缀:$cond中写的_id会被MongoDB识别为字符串常量"_id",而非分组的_id字段值。非空字符串的布尔判定为真,导致所有分组都命中$cond的第一个分支,这也是你得到free:2、nonFree:0的直接原因。 - 未使用第一次分组的统计结果:第一个
$group已经统计出了每个isFree取值对应的文档数count,第二个分组求和时只加固定值1或0,相当于统计的是isFree的枚举值数量,而非对应文档总数。
修复方案1(基于现有写法调整)
补充字段引用的$前缀,同时把求和的固定值替换为第一次分组得到的$count即可:
db.collection.aggregate([ { "$group": { "_id": "$isFree", "count": { "$sum": 1 } } }, { "$group": { _id: null, free: { $sum: { $cond: ["$_id", "$count", 0] } }, nonFree: { $sum: { $cond: ["$_id", 0, "$count"] } } } }, // 可选:去掉输出中的_id字段,和你预期的输出格式完全匹配 { $project: { _id: 0 } } ])
修复方案2(性能更优的单次分组写法)
其实不需要拆成两次$group,直接在全局分组中逐行判断isFree的值计数即可,执行效率更高:
db.collection.aggregate([ { $group: { _id: null, free: { $sum: { $cond: ["$isFree", 1, 0] } }, nonFree: { $sum: { $cond: ["$isFree", 0, 1] } } } }, { $project: { _id: 0 } } ])
两种方案执行后都会得到你预期的输出:
{ "free": 1, "nonFree": 3 }
内容的提问来源于stack exchange,提问作者Gnanavel
相关产品推荐
相关产品推荐

