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

