MongoDB中实现两个对象共通键值的差值计算问题
MongoDB聚合实现对象共通键值减法计算
直接实现方案(一步到位)
无需单独保留commonKeys字段,可在聚合阶段直接完成筛选共通键、计算差值并转回对象的操作:
{ $addFields: { mdDifferences: { $arrayToObject: { $map: { input: { $filter: { input: { $objectToArray: "$userMDs" }, as: "userMd", cond: { $in: ["$$userMd.k", { $map: { input: { $objectToArray: "$matchMDs" }, as: "matchMd", in: "$$matchMd.k" } }] } } }, as: "item", in: { k: "$$item.k", v: { $subtract: ["$$item.v", { $getField: ["$$item.k", "$matchMDs"] }] } } } } } } }
代码逻辑说明
$objectToArray: 将userMDs和matchMDs对象转换为[{k: 键名, v: 数值}]格式的数组,便于遍历操作。$filter: 筛选出userMDs中所有存在于matchMDs的键,逻辑和你之前提取commonKeys完全一致。$map: 遍历筛选后的共通键数组,对每个键执行减法计算:userMDs对应值 - matchMDs对应值,通过$getField直接从matchMDs对象中获取对应键的数值。$arrayToObject: 将计算后的键值对数组重新转换为对象,得到最终的差值结果mdDifferences。
优化版(提升效率)
若数据量较大,可先提取matchMDs的键数组避免重复转换,减少计算开销:
{ $addFields: { matchMDsKeys: { $map: { input: { $objectToArray: "$matchMDs" }, as: "matchMd", in: "$$matchMd.k" } } } }, { $addFields: { mdDifferences: { $arrayToObject: { $map: { input: { $filter: { input: { $objectToArray: "$userMDs" }, as: "userMd", cond: { $in: ["$$userMd.k", "$matchMDsKeys"] } } }, as: "item", in: { k: "$$item.k", v: { $subtract: ["$$item.v", { $getField: ["$$item.k", "$matchMDs"] }] } } } } }, matchMDsKeys: "$$REMOVE" // 移除中间临时字段 } }
结果示例
针对你提供的测试数据,最终生成的mdDifferences对象所有键的差值均为0:
{ "md1": 0, "md2": 0, "md3": 0, "md7": 0, "md15": 0, "md19": 0, "md20": 0, "md21": 0, "md25": 0, "md26": 0 }
内容的提问来源于stack exchange,提问作者marius
相关产品推荐
相关产品推荐

