Supponendo che entrambi gli array abbiano la stessa lunghezza, puoi utilizzare l'aggregazione di seguito:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$range
viene utilizzato per generare un array di 4 elementi in questo caso (0,1,2,3)
e quelli sono usati come indici per $arrayElemAt
operatore. $reduce
somma semplicemente tutti i prodotti per indici particolari restituendo un valore scalare. Ci sono due variabili speciali usate in $reduce
:$$value
rappresenta la somma mentre $$this
rappresenta l'indice generato da $range