如何在MongoDB中根据sensorId计算并新增multiplied_consumption字段
MongoDB 字段计算与新增解决方案
你可以通过 MongoDB 的聚合查询或文档更新操作实现需求,以下是两种实用方法:
方法一:聚合查询(仅返回计算结果,不修改原文档)
利用 $project 阶段转换对象格式并匹配计算,适合临时查看结果:
db.collection.aggregate([ { $project: { metadata: 1, data: 1, coef: 1, multiplied_consumption: { $multiply: [ "$data.consumption", { $getField: { field: "v", input: { $first: { $filter: { input: { $objectToArray: "$coef" }, cond: { $eq: ["$$this.k", "$metadata.sensorId"] } } } } } } ] } } } ])
方法二:更新文档(永久新增字段)
如果需要直接修改原文档,使用聚合管道式更新批量处理:
db.collection.updateMany( {}, // 此处可添加筛选条件,空对象匹配所有文档 [ { $set: { multiplied_consumption: { $multiply: [ "$data.consumption", { $getField: { field: "v", input: { $first: { $filter: { input: { $objectToArray: "$coef" }, cond: { $eq: ["$$this.k", "$metadata.sensorId"] } } } } } } ] } } } ] )
核心逻辑说明
$objectToArray:将coef对象转为[{k: "传感器ID", v: 系数}, ...]的数组格式,便于匹配$filter:从数组中筛选出与metadata.sensorId对应的元素$first:取筛选结果的第一个元素(每个传感器ID在coef中唯一)$getField:提取元素中的系数值(v)$multiply:将data.consumption与系数相乘得到最终结果
内容的提问来源于stack exchange,提问作者ArrowRise
相关产品推荐
相关产品推荐

