Zakładając, że obie tablice mają tę samą długość, możesz użyć poniższej agregacji:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range
służy do wygenerowania tablicy składającej się z 4 elementów w tym przypadku (0,1,2,3)
a te są używane jako indeksy dla $arrayElemAt
operator. $reduce
po prostu sumuje wszystkie produkty dla poszczególnych indeksów, zwracając wartość skalarną. Istnieją dwie specjalne zmienne używane w $reduce
:$$value
reprezentuje sumę, podczas gdy $$this
reprezentuje indeks wygenerowany przez $range