MongoDB聚合查询纽约州各城市全部邮政编码及总人口问题求助
问题根因
你当前查询结果异常的核心原因是聚合管道最后一步的$group阶段错误使用了$last操作符,该操作符只会提取分组后的最后一条文档数据,自然会丢失同一个城市其他邮政编码的信息。同时原有管道先全量分组再过滤的写法性能较差,可直接优化为单次分组逻辑。
修正后的查询语句
db.getCollection('codes').aggregate([ // 第一步先过滤纽约州数据,大幅降低后续阶段的处理数据量 { $match: { "state": "NY" } }, // 直接按城市分组完成统计 { $group: { _id: "$city", population: { $sum: "$pop" }, postal_codes: { $addToSet: "$_id" } } }, // 可选:按城市名称字母排序,不需要可直接删除该阶段 { $sort: { _id: 1 } } ])
逻辑说明
- 先执行
$match过滤掉非纽约州的所有文档,避免无效计算 - 按城市字段直接分组:
- 用
$sum累加该城市所有邮编对应的人口,得到城市总人口 - 用
$addToSet收集该城市所有的邮编值(因为邮编是文档唯一_id,不会重复,也可以用$push替代)
- 用
- 可选的排序阶段可以让输出结果按城市名称有序展示
如果一定要保留你原有两步分组的写法,只需要把最后一步$group的操作符修改为:人口用$sum累加、邮编数组用$push收集后再展开即可,但完全没必要多做一次分组,上述优化后的写法执行效率更高。
内容的提问来源于stack exchange,提问作者com_thit_nuong
相关产品推荐
相关产品推荐

