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

MongoDB聚合:按gameId分组并拆分城市维度统计数据

MongoDB 按游戏ID+城市维度聚合统计方案

直接用**双层$group**就能实现需求,先按gameId+city做基础统计,再把同一游戏ID下的城市数据聚合整理,具体管道如下:

db.collection.aggregate([
  // 第一步:按gameId+city分组,计算每个城市的核心统计值
  {
    $group: {
      _id: {
        gameId: "$gameId",
        city: "$city"
      },
      totalScore: { $sum: "$score" },
      people: { $addToSet: "$name" }, // 用$addToSet去重用户,需保留重复用户就换$push
    }
  },
  // 第二步:计算每个城市的用户数量,补全统计字段
  {
    $addFields: {
      peopleCount: { $size: "$people" }
    }
  },
  // 第三步:按gameId重新分组,整合同游戏下的所有城市统计结果
  {
    $group: {
      _id: "$_id.gameId",
      cityStats: {
        $push: {
          city: "$_id.city",
          totalScore: "$totalScore",
          people: "$people",
          peopleCount: "$peopleCount"
        }
      }
    }
  },
  // 可选:重命名字段让输出结构更直观
  {
    $project: {
      _id: 0,
      gameId: "$_id",
      cityStats: 1
    }
  }
])

关键阶段说明:

  • 第一层$group:同时以gameId和city作为分组键,确保每个分组对应某游戏下的单个城市,用$sum累加总分,$addToSet收集去重后的用户名称列表。
  • $addFields:通过$size直接基于已收集的用户列表计算数量,比分组阶段单独统计更高效。
  • 第二层$group:以gameId为分组键,用$push把同一游戏下的所有城市统计结果打包成数组,输出结构完全匹配需求。

输出示例:

{
  "gameId": "0001A",
  "cityStats": [
    {
      "city": "London",
      "totalScore": 120,
      "people": ["Bob", "Alice"],
      "peopleCount": 2
    },
    {
      "city": "Paris",
      "totalScore": 80,
      "people": ["Charlie"],
      "peopleCount": 1
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:55:18