gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:00:53 26 4
gpt4 key购买 nike

我有一个 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.insert({ year: 1900, alabama: 145, arkansas: 103 })

> db.test.insert({ year: 1901, alabama: 100, arkansas: 77 })

// Map function, emits the state name and the value for each entry
> var m = function () {
for(var key in this) {
if(this.hasOwnProperty(key) &&
key != 'year' && key!='_id')
emit(key, this[key])
}
}

// Reduce function, just sums up the score per state
> var r = function (state, score) { return Array.sum(score); }

// Run mapreduce with map function m, reduce function r, and output inline
> db.test.mapReduce(m, r, {out:{inline:1}})

{
"results" : [
{
"_id" : "alabama",
"value" : 245
},
{
"_id" : "arkansas",
"value" : 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 }

关于mongodb - 如何对 MongoDB 集合中的多个键求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24249182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com