我的文件格式如下:
{
'_id': ObjectId('5a7884437443cfd470893efc'),
'source': [1,2,3,3]
'sink': [5,6,7,8]
}
如何使用聚合管道
计算源和接收器阵列(向量)之间的点积答案 0 :(得分:3)
假设两个数组具有相同的长度,您可以使用以下聚合:
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
表示总和,而$$this
表示$range
生成的索引