Za předpokladu, že obě pole mají stejnou délku, můžete použít níže agregaci:
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 používá ke generování pole 4 prvků v tomto případě (0,1,2,3)
a ty se používají jako indexy pro $arrayElemAt
operátor. $reduce
jednoduše sečte všechny produkty pro konkrétní indexy a vrátí skalární hodnotu. V $reduce
jsou použity dvě speciální proměnné :$$value
představuje součet, zatímco $$this
představuje index generovaný $range