如何正确解析含多级数组的MongoDB字段并提取参数求和
问题原因
你第二次$unwind返回null的核心原因是cities字段为对象类型,而$unwind运算符仅支持对数组类型字段做展开操作,直接作用于对象无法得到预期结果。
解决方法
先将cities对象转换为数组,再做后续提取、求和操作即可,完整聚合管道参考如下:
db.collection.aggregate([ // 此处为你已经完成的第一次$unwind操作,后续步骤接在原有管道之后 // 1. 将cities对象转换为键值对数组,格式为[{k: "城市名", v: {param1, param2}}] { $addFields: { city_list: { $objectToArray: "$cities" } } }, // 2. 展开转换后的城市数组 { $unwind: "$city_list" }, // 3. 提取所需字段,格式化输出结构 { $project: { _id: 0, account_id: 1, param1: "$city_list.v.param1", param2: "$city_list.v.param2" } }, // 4. 对param1和param2求和,如需按account_id分组求和,把_id改为"$account_id"即可 { $group: { _id: null, total_param1: { $sum: "$param1" }, total_param2: { $sum: "$param2" }, // 如需保留所有明细数据可添加下面一行 details: { $push: "$$ROOT" } } } ])
按你给出的测试数据运行后,total_param1结果为12,total_param2结果为11,符合预期。
内容的提问来源于stack exchange,提问作者Rownum Highart
相关产品推荐
相关产品推荐

