如何对MongoDB集合中的多个键求和

如何对MongoDB集合中的多个键求和,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个MongoDB集合,其中的文档格式如下: { year: 1900, alabama: 145, arkansas: 103, // ... for all 50 US states } 我想要一个查询,给出每个州集合的总和。因此,结果可能如下所示: { alabama: 1360492, arkansas: 598023, // ... and so on } 我能想到的最好的方法是一个包含50个术语的聚合查询: db.sam

我有一个MongoDB集合,其中的文档格式如下:

{
    year: 1900,
    alabama: 145,
    arkansas: 103,
    // ... for all 50 US states
}
我想要一个查询,给出每个州集合的总和。因此,结果可能如下所示:

{
    alabama: 1360492,
    arkansas: 598023,
    // ... and so on
}
我能想到的最好的方法是一个包含50个术语的聚合查询:

db.sample.aggregate({$group: {
    _id: "",
    alabama: {$sum: "$alabama"},
    arkansas: {$sum: "$arkansas"},
    // ... and so on
}});

有什么方法可以构造查询,让我只提供一个需要求和的字段名数组吗?

我不知道使用聚合框架的方法,但是使用mapreduce,这是非常简单的

>db.test.插入{年份:1900,阿拉巴马州:145,阿肯色州:103} >db.test.insert{年份:1901,阿拉巴马州:100,阿肯色州:77} //Map函数,为每个条目发出状态名称和值 >var m=函数{ forvar键在这个{ 如果这个有自己的财产 钥匙!=“年份”和钥匙!=“U id” 钥匙,这个[钥匙] } } //Reduce函数,只对每个状态的分数求和 >var r=函数状态,分数{return Array.sumscore;} //使用映射函数m、reduce函数r运行mapreduce,并内联输出 >db.test.mapReducem,r,{out:{inline:1} { 结果:[ { _id:阿拉巴马州, 价值:245 }, { _id:阿肯色州, 数值:180 } ] } 编辑:为了能够使用聚合框架,我没有办法不稍微更改数据模型,以便能够作为键访问状态

> db.test2.insert({ year: 1900, data:[{k:"alabama", v:145}, 
                                      {k:"arkansas", v:103}] } )

> db.test2.insert({ year: 1901, data:[{k:"alabama", v:100}, 
                                      {k:"arkansas", v:77}] } )

// Unwind data, and group it back together by key while summing the values;
> db.test2.aggregate({$unwind:"$data"},
                     {$group:{_id:"$data.k",total:{$sum: "$data.v"}}})

{ "_id" : "arkansas", "total" : 180 }
{ "_id" : "alabama", "total" : 245 }

我不知道使用聚合框架做这件事的方法,但是使用mapreduce,这是相当直接的

>db.test.插入{年份:1900,阿拉巴马州:145,阿肯色州:103} >db.test.insert{年份:1901,阿拉巴马州:100,阿肯色州:77} //Map函数,为每个条目发出状态名称和值 >var m=函数{ forvar键在这个{ 如果这个有自己的财产 钥匙!=“年份”和钥匙!=“U id” 钥匙,这个[钥匙] } } //Reduce函数,只对每个状态的分数求和 >var r=函数状态,分数{return Array.sumscore;} //使用映射函数m、reduce函数r运行mapreduce,并内联输出 >db.test.mapReducem,r,{out:{inline:1} { 结果:[ { _id:阿拉巴马州, 价值:245 }, { _id:阿肯色州, 数值:180 } ] } 编辑:为了能够使用聚合框架,我没有办法不稍微更改数据模型,以便能够作为键访问状态

> db.test2.insert({ year: 1900, data:[{k:"alabama", v:145}, 
                                      {k:"arkansas", v:103}] } )

> db.test2.insert({ year: 1901, data:[{k:"alabama", v:100}, 
                                      {k:"arkansas", v:77}] } )

// Unwind data, and group it back together by key while summing the values;
> db.test2.aggregate({$unwind:"$data"},
                     {$group:{_id:"$data.k",total:{$sum: "$data.v"}}})

{ "_id" : "arkansas", "total" : 180 }
{ "_id" : "alabama", "total" : 245 }

在性能方面,您是否有任何直觉可以将其与聚合框架进行比较?@TomPanning聚合框架通常更快,如果您可以编写等效的查询,但是,在这种情况下,我不知道如何使用现有的数据模型。@TomPanning添加了一种方法,可以在稍微更改数据模型时使用聚合。从性能角度来看,您对这两者的比较有何直觉,使用聚合框架?@TomPanning聚合框架通常更快,如果您可以编写等效的查询,但是在这种情况下,我不知道如何使用现有的数据模型。@TomPanning添加了一种在稍微更改数据模型时使用聚合的方法。