0

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

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

为了这个问题的简单起见,我假设我$match只点击了这个文件。我想做的是,在一个聚合命令中,将0s 相加,将1s 相加,然后将 s 相加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)

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

4

1 回答 1

-1

如果您知道要求和的所有数组的名称,则可以使用 MongoDB 2.2+ 中的聚合框架和带有$addoperator的投影:

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 或在应用程序代码中实现逻辑。

于 2013-04-26T20:38:01.160 回答