Предполагая, что оба массива имеют одинаковую длину, которую вы можете использовать ниже агрегации:
db.collection.aggregate([
{
$project: {
dotProduct: {
$reduce: {
input: { $range: [ 0, { $size: "$source" }] },
initialValue: 0,
in: { $add: [ "$$value", { $multiply: [ { $arrayElemAt: [ "$source", "$$this" ] }, { $arrayElemAt: [ "$sink", "$$this" ] } ] } ] }
}
}
}
}
])
$ range используется для генерации массива из 4 элементов, в данном случае (0,1,2,3)
и тех,используются в качестве индексов для оператора $ arrayElemAt . $ redu * просто суммирует все продукты для определенных индексов, возвращая скалярное значение.В $reduce
используются две специальные переменные: $$value
представляет сумму, а $$this
представляет индекс, сгенерированный $range