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

MongoDB统计isFree字段true和false数量聚合查询结果异常排查

问题原因

你的聚合语句存在两处错误:

  1. 引用字段时未加$前缀:$cond中写的_id会被MongoDB识别为字符串常量"_id",而非分组的_id字段值。非空字符串的布尔判定为真,导致所有分组都命中$cond的第一个分支,这也是你得到free:2、nonFree:0的直接原因。
  2. 未使用第一次分组的统计结果:第一个$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:01