【问题标题】:Calculate Dot Product between two arrays with MongoDB Aggregate使用 MongoDB Aggregate 计算两个数组之间的点积
【发布时间】:2018-05-17 22:40:29
【问题描述】:

我有以下格式的文件:

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

如何使用聚合管道计算源和汇数组(向量)之间的点积

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

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

    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代表sum,$$this代表$range生成的索引

    【讨论】:

    • @HassanSaif 你的意思是两个以上的数组?
    • 替代者可以使用$zip 而不是$range 并从每个“压缩”元素中获取01 索引。但是逻辑说的差不多,只是少了几个字符。不幸的是$multiply 还不接受数组引用。如果是这样,那么表达式会明显更短。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2021-02-06
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多