Suponiendo que ambas matrices tengan la misma longitud, puede usar la siguiente agregación:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range
se utiliza para generar una matriz de 4 elementos en este caso (0,1,2,3)
y esos se usan como índices para $arrayElemAt
operador. $reduce
simplemente suma todos los productos para índices particulares que devuelven valor escalar. Hay dos variables especiales usadas en $reduce
:$$value
representa la suma mientras que $$this
representa el índice generado por $range