【发布时间】:2014-09-11 08:40:27
【问题描述】:
我正在尝试处理一个数字系列(集合),分别获取奇数/偶数的总和以及计算每个考虑的元素。
numberseries 文档结构如下:
{
_id: <Autogenerated>,
number: <any number, it can repeat. Even if it repeats, it should be added each time. >
}
输出如下(不准确,但一般)
{
..
{
"odd":<result>, elements:{n1,n3,n5}
},
{
"even":<result>, elements:{n2,n4,n6}
}
..
}
地图功能:
mapf = function(){
var value = { sum : 0, elements :[] };
value.sum = this.number;
value.elements.push(this.number);
print(tojson(value));
if( this.number % 2 != 0 ){
emit( "odd", value );
}
if( this.number % 2 == 0 ){
emit( "even", value );
}
}
减少Values 参数:
Values 是从地图发出的 JSON 数组:
[{
"sum": 1,
"elements": [1]
}, {
"sum": 3,
"elements": [3]
} ... ]
减少功能:
reducef = function(key, values){
var result = { sum : 0 , elements:[] };
print("K " + key +"Values array " + tojson(values) );
for(var i = 0; i<values.length;i++ ){
v = values[i];
print("Key "+key+"V.JSON"+tojson(v)+" V.SUM -> "+v.sum);
result.sum += v.sum;
result.elements.push(v.elements[0]);
print(tojson(result));
}
return result;
}
我得到了正确的总和,但是元素数组没有正确填充。它仅包含一些考虑用于计算的元素。
更新
根据Neil给出的答案,我进一步验证了我的代码。我发现我的代码未经任何修改,适用于小数据集,但不适用于大数据集。
以下是我已经验证的点,我发现我的代码是正确的。
print("K " + key +"Values array " + tojson(values) );
reduce 函数中的上述行导致打印以下 values 对象。
[{
"sum": 1,
"elements": [1]
}, {
"sum": 3,
"elements": [3]
}, {
"sum": 5,
"elements": [5]
}, {
"sum": 7,
"elements": [7]
}, {
"sum": 9,
"elements": [9]
}, {
"sum": 11,
"elements": [11]
}, {
"sum": 13,
"elements": [13]
}, {
"sum": 15,
"elements": [15]
}, {
"sum": 17,
"elements": [17]
}, {
"sum": 19,
"elements": [19]
}]
因此在最终结果result.elements.push(v.elements[0]); 中将元素推送到数组的行应该是正确的。
在map函数中,在发射之前,我将value.sum修改如下
value.sum = this.number;
这可确保sum 不为零,并且因此可以正确添加数字。
- 当我用 20 条记录、40 条记录、100 条记录测试这段代码时,它运行良好。
- 当我用 20000 条记录测试这段代码时,总和值是正确的,但元素数组 每个不包含 10000 个元素(奇数和偶数在集合中平均分布)。
在以后的情况下,我收到以下消息:
查询未记录(太大)
【问题讨论】:
标签: mongodb mapreduce mongodb-query aggregation-framework