问题描述
我正在尝试对 mongodb 2.0.1 中每个组的元素数量进行分组和计数,但到目前为止没有成功.
I'm trying to group and count the amount of elements for each group in mongodb 2.0.1, but with no success so far.
我的数据库架构如下所示:
My DB schema looks like :
{
"_id" : ObjectId("4ece7544853b4b0941000000"),
"ResultSet" : {
"Results" : [
{
"quality" : 87,
"state" : "Franche-Comté"
}
]
}
}
我一直在尝试各种方法,遵循不同的教程,但每次都是相同的结果:一个唯一的空组......我不明白为什么.
I've been trying all sort of methods, following different tutorials, but it is each time the same result : an only null group... which I don't understand why.
到目前为止我写的最好的查询如下:
The best query I have written so far is the following :
db.extract_2000.group( {
cond: { "ResultSet.Results.quality": {$exists: true} },
key: {"ResultSet.Results.state": true},
reduce: function(obj, glob) { glob.total++; glob.quality += obj.ResultSet.Results.quality },
initial: { total: 0, quality: 0 },
finalize: function(glob) {glob.avgquality = glob.quality / glob.total}
})
返回(再次):
[
{
"ResultSet.Results.state" : null,
"total" : 2000,
"quality" : NaN,
"avgquality" : NaN
}
]
我做错了什么?
推荐答案
这根本不会像写的那样工作.关键问题在这里:key: {"ResultSet.Results.state": true}
.ResultSet.Results
是一个数组.当您要求 ResultSet.Results.state
时,您是在暗示某种类型的 for
循环在这里完成.group
命令根本无法做到这一点.
This simply won't work as written. The key problem is here: key: {"ResultSet.Results.state": true}
. ResultSet.Results
is an array. When you ask for ResultSet.Results.state
you are implying some type of for
loop be done here. The group
command is simply not capable of this.
请尝试以下 M/R:
map = function() {
// Note that we emit once per result
foreach(var i in ResultSet.Results) {
key = this.ResultSet.Results[i];
value = { count: 1,
quality: this.ResultSet.Results[i].quality,
avg_quality: 0
};
emit(key, value);
}
}
reduce = function(key, values) {
// note that results has same fields as emitted value
var results = { count: 0, quality: 0, avg_quality: 0 };
foreach(var i in values){
results.count += values[i].count;
results.quality += values[i].quality;
// ignore avg_quality, we don't use it
}
return results;
}
您还必须为平均值编写 finalize
.
You will also have to write a finalize
for the average.
finalize = function(key, value) {
if (value.count > 0)
value.avg_quality = value.quality / value.count;
return value;
}
这篇关于在 MongoDB 中分组和计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!