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

MongoDB用户集合按城市、性别统计的聚合管道方案求解

MongoDB按城市统计男女数量聚合管道方案

原代码存在的问题

  • 集合名错误:应操作users集合而非testCollection
  • 分组字段错误:使用了不存在的$status字段,实际需按city分组
  • 累加器用法错误:$count是独立聚合阶段,不能在$group中作为累加器,统计数量需用$sum:1

方案一:分步分组整理结构

这种方案先按城市+性别分组统计,再将结果合并为按城市聚合的结构,适合性别枚举可能扩展的场景:

db.users.aggregate([
  // 按城市和性别组合分组,统计每组用户数
  {
    $group: {
      _id: {
        city: "$city",
        gender: "$gender"
      },
      count: { $sum: 1 }
    }
  },
  // 按城市重新分组,将各性别统计整理为数组
  {
    $group: {
      _id: "$_id.city",
      stats: {
        $push: {
          k: "$_id.gender",
          v: "$count"
        }
      }
    }
  },
  // 转换为目标结构:城市 + 男女数量键值对
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          { city: "$_id" },
          { $arrayToObject: "$stats" }
        ]
      }
    }
  }
])

方案二:直接分组统计(更简洁)

如果性别固定为Male和Female,可以直接在分组阶段用条件累加,一步得到结果:

db.users.aggregate([
  {
    $group: {
      _id: "$city",
      // 统计男性数量:性别为Male时加1,否则加0
      Male: {
        $sum: { $cond: [{ $eq: ["$gender", "Male"] }, 1, 0] }
      },
      // 统计女性数量
      Female: {
        $sum: { $cond: [{ $eq: ["$gender", "Female"] }, 1, 0] }
      }
    }
  },
  // 可选:调整字段名称,让结构更贴合目标schema
  {
    $project: {
      _id: 0,
      city: "$_id",
      Male: 1,
      Female: 1
    }
  }
])

输出示例

两种方案最终都会输出类似如下的文档结构:

{ "city": "Beijing", "Male": 25, "Female": 30 }
{ "city": "Shanghai", "Male": 40, "Female": 35 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:25:21