2013-04-26 189 views
0

我有一些文件看起来像这样:聚合函数可以与字段名称中的变量一起使用吗?

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

对于这个问题简单起见,我假设我$match只打这一个文件。我想要做的是,在aggregate命令,加起来0 S,并添加了1 S,并添加了2 S,这样我就可以产生这样的:

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都在一起等等?

回答

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

+0

我希望有一个通配符或某些东西,这样我就不会有最长的命令,当我将所有24个字段添加到子文档 – DiMono 2013-04-30 12:28:25

+0

@DiMono:根据我在答案结尾的评论,那么MapReduce或应用程序逻辑可能是更合适的解决方案。原始问题只提到元素0/1/2,但如果您有24个字段,则聚合框架将变得更加冗长。如果您只是在单个文档(或少量文档)上进行这种计算,则只需在应用程序逻辑中迭代文档就可能是最有效的。如果您需要针对一系列文档运行计算,那将有利于使用MapReduce。 – Stennie 2013-05-01 13:34:44

+0

当然,您可以始终以编程方式构建Aggregation Framework管道,因此您不必自己写出24个字段。对于单个文档来说这仍然是过分的。根据您需要运行此查询的频率,另一个需要考虑的选项是[预汇总](http://docs.mongodb.org/manual/use-cases/pre-aggregated-reports/),以便您可以调整总和为您的嵌套文档设置相同的更新值。 – Stennie 2013-05-01 13:38:19

相关问题