Ervan uitgaande dat beide arrays dezelfde lengte hebben, kunt u onderstaande aggregatie gebruiken:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range
wordt gebruikt om een array van 4 elementen te genereren, in dit geval (0,1,2,3)
en die worden gebruikt als indexen voor $arrayElemAt
exploitant. $reduce
somt eenvoudig alle producten voor bepaalde indexen op en geeft de scalaire waarde terug. Er worden twee speciale variabelen gebruikt in $reduce
:$$value
staat voor som terwijl $$this
staat voor index gegenereerd door $range