Forudsat at begge arrays har samme længde, kan du bruge nedenstående aggregering:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range
bruges til at generere en matrix af 4 elementer i dette tilfælde (0,1,2,3)
og disse bruges som indekser for $arrayElemAt
operatør. $reduce
summerer simpelthen alle produkter for bestemte indekser og returnerer skalarværdi. Der er to specielle variabler brugt i $reduce
:$$value
repræsenterer sum mens $$this
repræsenterer indeks genereret af $range