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
相关产品推荐
相关产品推荐

