MongoDB按三个字段(state、district、salesman)实现层级分组统计的查询方法
实现按State→District→Salesman的层级分组统计
Got it,要实现这种三层嵌套的分组统计,MongoDB的聚合管道是完美的解决方案。我们可以通过多层$group操作逐步构建嵌套结构,同时完成各个层级的计数。下面是完整的查询语句,之后我会拆解每个阶段的作用:
db.yourCollectionName.aggregate([ // 1. 最细粒度分组:按州、地区、销售员统计单个销售员的数量 { $group: { _id: { state: "$state", district: "$district", salesman: "$salesman" }, count: { $sum: 1 } } }, // 2. 中间层分组:按州、地区聚合,嵌套销售员列表并统计地区总人数 { $group: { _id: { state: "$_id.state", district: "$_id.district" }, salesmen: { $push: { salesman: "$_id.salesman", count: "$count" } }, districtCount: { $sum: "$count" } } }, // 3. 顶层分组:按州聚合,嵌套地区列表并统计州总人数 { $group: { _id: "$_id.state", districts: { $push: { district: "$_id.district", salesmen: "$salesmen", count: "$districtCount" } }, total: { $sum: "$districtCount" } } }, // 可选:调整输出字段名,让结果更贴合预期格式 { $project: { _id: 0, state: "$_id", districts: 1, total: 1 } } ])
各聚合阶段详解
- 第一层
$group:这是最基础的分组,把state、district、salesman作为联合主键,统计每个销售员在对应地区的出现次数(在你的样本数据里每个销售员只出现一次,所以count都是1)。 - 第二层
$group:基于第一层的结果,按state和district聚合,用$push把当前地区的所有销售员信息打包成数组,同时用$sum计算该地区的总销售员数量。 - 第三层
$group:再往上聚合到州级别,用$push把当前州的所有地区信息打包成数组,同时统计整个州的总销售员数量。 $project阶段:这一步是可选的,主要是把默认的_id字段重命名为state,并移除原_id,让输出格式完全匹配你给出的示例。
预期输出结果
运行上述查询后,你会得到如下结构的结果(对应你的样本数据):
[ { "state": "Jharkhand", "districts": [ { "district": "Ranchi", "salesmen": [ { "salesman": "amit", "count": 1 }, { "salesman": "sumit", "count": 1 } ], "count": 2 }, { "district": "Bokaro", "salesmen": [ { "salesman": "rahul", "count": 1 }, { "salesman": "rajesh", "count": 1 }, { "salesman": "ravi", "count": 1 } ], "count": 3 } ], "total": 5 }, { "state": "Orisha", "districts": [ { "district": "Puri", "salesmen": [ { "salesman": "anish", "count": 1 }, { "salesman": "arjun", "count": 1 }, { "salesman": "aryan", "count": 1 } ], "count": 3 }, { "district": "Bhubneswar", "salesmen": [ { "salesman": "anuj", "count": 1 }, { "salesman": "chandan", "count": 1 }, { "salesman": "charan", "count": 1 } ], "count": 3 } ], "total": 6 } ]
注意:记得把查询语句里的
yourCollectionName替换成你实际的集合名称哦!
内容的提问来源于stack exchange,提问作者AD G
相关产品推荐
相关产品推荐

