MongoDB:为数组中缺失quantity属性的对象补值后求和
MongoDB数组对象属性求和(缺失值用1替代)
你的问题出在直接对$buyers.quantity使用$ifNull——这个表达式会返回一个包含所有buyer的quantity值的数组,当数组里存在部分元素缺失quantity时,$ifNull只会判断整个数组是否为null,不会逐个处理每个元素的缺失情况,导致缺失quantity的元素被当作0参与求和,不符合需求。
正确的做法是先遍历buyers数组,逐个处理每个对象的quantity属性,再对处理后的结果求和,有两种常用实现方式:
方式一:$map + $sum
$addFields: { sumBought: { $sum: { $map: { input: "$buyers", as: "buyer", in: { $ifNull: ["$$buyer.quantity", 1] } } } } }
$map遍历buyers数组的每个元素,将单个元素命名为buyer- 对每个
buyer,用$ifNull检查quantity:存在则取其值,不存在则用1替代 - 最后用
$sum对$map返回的数值数组求和
方式二:$reduce
$addFields: { sumBought: { $reduce: { input: "$buyers", initialValue: 0, in: { $add: [ "$$value", { $ifNull: ["$$this.quantity", 1] } ] } } } }
$reduce以0为初始值,遍历buyers数组- 每次迭代将当前累计值(
$$value)与当前buyer的处理后quantity值(缺失则用1)相加,最终得到总和
内容的提问来源于stack exchange,提问作者Sniady
相关产品推荐
相关产品推荐

