在mongoDB中按元素添加列表

时间:2015-04-06 13:58:13

标签: mongodb vector aggregation-framework addition

我有一组文件,每个文件都有一个矢量字段:

'vector':[x1, x2, ..., xn]

如何执行所有'vector'字段的按元素添加?

我的最终目标是获取集合子集的平均'vector'字段。

我正在使用聚合框架$match某个子集,然后使用$unwind:vector来获取此子集。下一步是按文件计数执行逐元素加法和除法,我不知道如何做到这一点。


收集子集:

{
    "_id" : 1,
    "vector" : [
                1,
                2,
                3

    ]

}


{
    "_id" : 2,
    "vector" : [
                3,
                2,
                1

    ]

}

预期结果:

avgVector:[1+3, 2+2, 3+1]/2 = [2, 2, 2]

1 个答案:

答案 0 :(得分:0)

您可以执行此操作,因为n = 3,其中n是向量的长度。一般而言,我不相信您可以使用该文档结构对元素进行元素添加。没有办法直接组合向量,但是如果你放松它们,你通常不会有一种组合相似组件的方法。

但是,当向量的长度为3时,我们可以破解它:

db.vectors.aggregate([
    // put a $match here if you want to consider a subset
    { "$unwind" : "$vector" },
    { "$group" : { 
        "_id" : "$_id",
        "first" : { "$first" : "$vector" }, 
        "last" : { "$last" : "$vector" },
        "v_sum" : { "$sum" : "$vector" }
    } },
    { "$group" : {
        "_id" : null,
        "avg_first" : { "$avg" : "$first" },
        "avg_last" : { "$avg" : "$last" },
        "v_avg" : { "$avg" : "$v_sum" }
    } },
    { "$project" : {
        "avg_first" : 1,
        "avg_last" : 1,
        "avg_middle" : { "$subtract" : [{ "$subtract" : ["$v_avg", "$avg_first"] }, "$avg_last"] }
    } }
])

我们可以选出第一个和最后一个组件,因为$unwind将保留数组的顺序。我们可以对这些进行平均并从所有组件的平均总和中减去平均值,以得到中间组件的平均值。