You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:28