Unter der Annahme, dass beide Arrays die gleiche Länge haben, können Sie die folgende Aggregation verwenden:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range
wird verwendet, um in diesem Fall ein Array aus 4 Elementen zu generieren (0,1,2,3)
und diese werden als Indizes für $arrayElemAt
verwendet Operator. $reduce
summiert einfach alle Produkte für bestimmte Indizes, die einen Skalarwert zurückgeben. Es gibt zwei spezielle Variablen, die in $reduce
verwendet werden :$$value
stellt die Summe dar, während $$this
stellt einen von $range
generierten Index dar