【发布时间】:2018-05-17 22:40:29
【问题描述】:
我有以下格式的文件:
{
'_id': ObjectId('5a7884437443cfd470893efc'),
'source': [1,2,3,3]
'sink': [5,6,7,8]
}
如何使用聚合管道计算源和汇数组(向量)之间的点积
【问题讨论】:
标签: mongodb aggregation-framework
我有以下格式的文件:
{
'_id': ObjectId('5a7884437443cfd470893efc'),
'source': [1,2,3,3]
'sink': [5,6,7,8]
}
如何使用聚合管道计算源和汇数组(向量)之间的点积
【问题讨论】:
标签: mongodb aggregation-framework
假设两个数组的长度相同,您可以在聚合下使用:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range 用于在这种情况下生成一个包含 4 个元素的数组 (0,1,2,3),这些元素用作 $arrayElemAt 运算符的索引。 $reduce 简单地将特定索引的所有产品相加,返回标量值。 $reduce中使用了两个特殊变量:$$value代表sum,$$this代表$range生成的索引
【讨论】:
$zip 而不是$range 并从每个“压缩”元素中获取0 和1 索引。但是逻辑说的差不多,只是少了几个字符。不幸的是$multiply 还不接受数组引用。如果是这样,那么表达式会明显更短。