聚合函数可以与字段名称中的变量一起使用吗?

时间:2013-04-26 15:59:35

标签: mongodb aggregation-framework

我有一些看起来像这样的文件:

{
    (...stuff...)
    something: {
        first: {
            0: 3,
            1: 5,
            2: 2
        },
        second: {
            0: 1,
            1: 9,
            2: 7
        }
    }
}

为了简化这个问题,我假设我的$match只能点击这一个文件。我想要做的是,在一个聚合命令中,将0加起来,然后将1加起来,然后将2加起来,这样我就可以产生这样的东西:

something.0:  4   (something.first.0 + something.second.0)
something.1: 14   (something.first.1 + something.second.1)
something.2:  9   (something.first.2 + something.second.2)

这是可以完成的事情,还是我需要更改我的文档架构以重新排列嵌套文档,以便所有0都在一起等等?

1 个答案:

答案 0 :(得分:0)

如果您知道要汇总的所有数组的名称,可以使用MongoDB 2.2+中的聚合框架和$add operator的投影:

db.something.aggregate(
    { $project: {
        something: {
            0: { $add: [ "$something.first.0", "$something.second.0" ] },
            1: { $add: [ "$something.first.1", "$something.second.1" ] },
            2: { $add: [ "$something.first.2", "$something.second.2" ] }
        }
    }}
)

示例输出:

{
    "result" : [
        {
            "_id" : ObjectId("517ae4914bc9ade96ca6402d"),
            "something" : {
                "0" : 4,
                "1" : 14,
                "2" : 9
            }
        }
    ],
    "ok" : 1
}

如果您不知道名称(即您正在尝试添加文档中每个数组元素的第0个元素),则需要使用MapReduce或在应用程序代码中实现逻辑。