如何在MongoDB聚合查询中按子数组索引使用$sum完成求和操作
问题原因与修正方案
- 核心错误:聚合阶段关键字拼写错误,你写的
$groups多了末尾的s,正确的分组聚合阶段是$group,这是代码不生效的首要原因。 - 逻辑说明:你已经通过
$unwind拆分了asks数组,拆分后的每一条记录的asks字段就是原二维数组里的单个[a, b]子数组,此时取索引1的值的逻辑本身没有问题,修正拼写错误后原逻辑即可正常运行。
修正后的原逻辑代码
db.getCollection("test").aggregate([ { $unwind: "$asks" }, { $group: { _id: 0, total: { $sum: { $arrayElemAt: ["$asks", 1] } }, count: { $sum: 1 }, }, }, ]);
性能优化方案(无需$unwind)
如果数据量较大,$unwind会产生大量中间记录拖慢执行效率,可以用$reduce运算符直接在每个文档内完成子数组索引1值的累加,再全局汇总,执行效率更高:
db.getCollection("test").aggregate([ { $group: { _id: 0, total: { $sum: { $reduce: { input: "$asks", initialValue: 0, in: { $add: ["$$value", { $arrayElemAt: ["$$this", 1] }] } } } }, count: { $sum: { $size: "$asks" } } } } ])
以上方案适配的文档结构为asks字段是二维数组,每一个子数组的索引1位置为需要累加的数值。
内容的提问来源于stack exchange,提问作者mean.cj
相关产品推荐
相关产品推荐

