如何使用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
相关产品推荐
相关产品推荐

