Supondo que ambas as matrizes tenham o mesmo comprimento, você pode usar a agregação abaixo:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range é usado para gerar um array de 4 elementos neste caso
(0,1,2,3)
e esses são usados como índices para $arrayElemAt
operador. $reduce
simplesmente soma todos os produtos para índices específicos que retornam valor escalar. Existem duas variáveis especiais usadas em $reduce
:$$value
representa a soma enquanto $$this
representa o índice gerado por $range