MongoDB聚合查询实现各州人口最高城市统计问题求助
MongoDB按州筛选人口最多城市的聚合查询实现方案
你当前遇到的报错原因很明确:$slice是数组专属操作符,第一步分组后的_id是包含state和city两个属性的对象,自然无法执行数组切片操作。
你已经完成了第一个目标(按州+城市分组汇总城市总人口),只需要在原有聚合管道基础上新增3个阶段即可实现第二个需求,完整代码如下:
db.getCollection("codes").aggregate([ // 阶段1:按州+城市分组,汇总每个城市的总人口 { "$group": { "_id": { "state": "$state", "city": "$city" }, "population": { "$sum": "$pop" } } }, // 阶段2:按城市总人口降序排序,保证同州下人口越多的城市排序越靠前 { "$sort": { "population": -1 } }, // 阶段3:按州分组,将同州所有城市的信息存入数组 { "$group": { "_id": "$_id.state", "city_list": { "$push": { "name": "$_id.city", "population": "$population" } } } }, // 阶段4:提取每个州排序后的第一个城市(即人口最多的城市),格式化输出 { "$project": { "_id": 0, "state": "$_id", "most_populous_city": { "$first": "$city_list.name" }, "total_population": { "$first": "$city_list.population" } } } ], { "allowDiskUse": false });
如果你使用的MongoDB版本低于5.2,不支持$project阶段直接使用$first操作符,可以替换为数组取值操作符$arrayElemAt兼容旧版本,修改$project阶段如下:
{ "$project": { "_id": 0, "state": "$_id", "most_populous_city": { "$arrayElemAt": ["$city_list.name", 0] }, "total_population": { "$arrayElemAt": ["$city_list.population", 0] } } }
最终输出字段包含州名、该州人口最多的城市名、对应城市总人口,和你预期的输出格式一致。
内容的提问来源于stack exchange,提问作者chmiga092020
相关产品推荐
相关产品推荐

