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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:02:44