Ако приемем, че и двата масива имат еднаква дължина, можете да използвате агрегирането по-долу:
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
оператор. $reduce
просто сумира всички продукти за определени индекси, връщайки скаларна стойност. Има две специални променливи, използвани в $reduce
:$$value
представлява сума, докато $$this
представлява индекс, генериран от $range