使用MongoDB Aggregate计算两个数组之间的Dot Product

时间:2018-05-17 14:29:18

标签: mongodb aggregation-framework

我的文件格式如下:

{
  '_id': ObjectId('5a7884437443cfd470893efc'),
  'source': [1,2,3,3]
  'sink': [5,6,7,8]
}

如何使用聚合管道

计算源和接收器阵列(向量)之间的点积

1 个答案:

答案 0 :(得分:3)

假设两个数组具有相同的长度,您可以使用以下聚合:

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生成的索引