MongoDB聚合查询中嵌套对象的投影与分组求和问题
MongoDB聚合查询报错排查与修正方案
现有文档数据
[ { city: "Mumbai", meta: { luggage: 2, scanLuggage: 1, upiLuggage: 1 }, cash: 10 }, { city: "Mumbai", meta: { luggage: 4, scanLuggage: 3, upiLuggage: 1 }, cash: 24 } ]
需求说明
匹配city为Mumbai的文档,对meta下的luggage、scanLuggage、upiLuggage三个字段分别求和。
报错原因
原聚合查询的问题集中在这几点:
- $project阶段拼写错误:把
meta.luggage写成了mata.luggage,字段名拼写错误直接导致投影失败 - $project嵌套字段写法错误:不能直接用
meta.scanLuggage: 1这种格式声明嵌套字段,需要用引号包裹键名或者对象嵌套形式 - $group阶段语法错误:分组的
_id字段写错了,正确格式是_id: "$city"(缺少下划线和字段引用的$符号) - 冗余的$project阶段:$match之后可以直接执行$group,完全不需要额外投影,多此一举反而容易出错
正确聚合查询写法
简洁版(最优写法,去掉冗余$project)
直接在$match后执行分组求和,最后可选重命名字段以匹配期望输出:
City.aggregate([ { $match: { city: 'Mumbai' } }, { $group: { _id: "$city", luggage: { $sum: "$meta.luggage" }, scanLuggage: { $sum: "$meta.scanLuggage" }, upiLuggage: { $sum: "$meta.upiLuggage" } } }, // 重命名_id为city,移除默认的_id字段 { $project: { _id: 0, city: "$_id", luggage: 1, scanLuggage: 1, upiLuggage: 1 } } ])
保留$project的修正版(仅作演示)
如果一定要保留投影阶段,需要修正字段写法:
City.aggregate([ { $match: { city: 'Mumbai' } }, { $project: { city: 1, "meta.luggage": 1, "meta.scanLuggage": 1, "meta.upiLuggage": 1 } }, { $group: { _id: "$city", luggage: { $sum: "$meta.luggage" }, scanLuggage: { $sum: "$meta.scanLuggage" }, upiLuggage: { $sum: "$meta.upiLuggage" } } }, { $project: { _id: 0, city: "$_id", luggage: 1, scanLuggage: 1, upiLuggage: 1 } } ])
最终输出结果
{ city: 'Mumbai', luggage: 6, scanLuggage: 4, upiLuggage: 2 }
内容的提问来源于stack exchange,提问作者Roomi
相关产品推荐
相关产品推荐

