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

如何使用MongoDB聚合管道计算数组间的点积?

用MongoDB聚合管道计算数组点积

嘿,我来帮你搞定这个问题!要计算source和sink这两个数组的点积,咱们可以结合MongoDB的几个聚合操作符来实现,直接上可行的方案和详细解释:

基础实现(假设数组长度一致)

假设你的集合名为yourCollection,可以用下面的聚合管道直接计算点积:

db.yourCollection.aggregate([
  {
    $project: {
      dotProduct: {
        $sum: {
          $map: {
            input: { $zip: { inputs: ["$source", "$sink"], useLongestLength: false } },
            as: "pair",
            in: { $multiply: ["$$pair.0", "$$pair.1"] }
          }
        }
      }
    }
  }
])

每个步骤的作用:

  • $zip:把source和sink数组的对应元素配对成子数组,比如你的示例数据会生成[[1,5], [2,6], [3,7], [3,8]]。useLongestLength: false表示只处理两个数组长度重叠的部分(如果长度不同,多余元素会被忽略,你也可以根据需求改成true来用最长数组的长度填充缺失值)。
  • $map:遍历每个配对的子数组,用$multiply计算两个元素的乘积,得到乘积数组[5, 12, 21, 24]。
  • $sum:把乘积数组里的所有元素相加,最终得到点积结果(你的示例数据结果是5+12+21+24=62)。

进阶实现(处理数组长度不一致的情况)

如果你的文档里两个数组长度可能不一样,咱们可以先判断长度是否相等,再决定是否计算点积,避免出错:

db.yourCollection.aggregate([
  {
    $project: {
      arraysLengthMatch: { $eq: [{ $size: "$source" }, { $size: "$sink" }] },
      source: 1,
      sink: 1
    }
  },
  {
    $project: {
      dotProduct: {
        $cond: {
          if: "$arraysLengthMatch",
          then: {
            $sum: {
              $map: {
                input: { $zip: { inputs: ["$source", "$sink"] } },
                as: "pair",
                in: { $multiply: ["$$pair.0", "$$pair.1"] }
              }
            }
          },
          else: "Arrays have different lengths, cannot calculate dot product"
        }
      }
    }
  }
])

这个版本会先检查两个数组长度是否匹配,如果不匹配就返回提示信息,而不是直接报错或者得到错误的计算结果。

内容的提问来源于stack exchange,提问作者Hassan Saif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:12:36