MongoDB数值差值计算:PE状态总值减CO与CA状态总值之和
MongoDB 实现方案
可以通过聚合管道完成这个计算逻辑,以下提供两种可行的实现脚本:
方法一:分步转换结构计算
db.collection.aggregate([ // 按状态分组,提取各状态的total值 { $group: { _id: "$status", total: { $sum: "$total" } } }, // 将所有分组结果合并为一个数组 { $group: { _id: null, data: { $push: { k: "$_id", v: "$total" } } } }, // 将数组转为键值对结构,方便直接调用各状态数值 { $replaceRoot: { newRoot: { $arrayToObject: "$data" } } }, // 执行目标计算并格式化输出 { $project: { _id: null, total: { $subtract: ["$PE", { $add: ["$CO", "$CA"] }] } } } ])
脚本说明
- 第一个
$group:按status字段分组,统计每个状态对应的total(因每个状态仅一条数据,结果即原数值)。 - 第二个
$group:将所有分组结果合并为一个文档,把状态和对应total存入数组data。 $replaceRoot+$arrayToObject:把数组转成键值对结构,让我们可以直接用$PE、$CO这样的字段名调用对应数值。- 最后一个
$project:按照要求计算PE - (CO + CA),同时指定_id为null,输出最终结果。
方法二:单分组直接计算(更简洁)
适用于确定CO、CA、PE三种状态都存在的场景:
db.collection.aggregate([ { $group: { _id: null, peTotal: { $sum: { $cond: [{ $eq: ["$status", "PE"] }, "$total", 0] } }, coCaTotal: { $sum: { $cond: [{ $in: ["$status", ["CO", "CA"]] }, "$total", 0] } } } }, { $project: { _id: null, total: { $subtract: ["$peTotal", "$coCaTotal"] } } } ])
脚本说明
- 单个
$group阶段完成数值提取:用$cond条件判断,分别累加PE的total,以及CO和CA的total总和。 - 后续
$project直接执行减法计算,得到目标结果。
内容的提问来源于stack exchange,提问作者Elton Mesquita
相关产品推荐
相关产品推荐

