MongoDB MapReduce:超过1000条记录未按预期工作
我编写了一个mapreduce函数,其中记录以以下格式发出MongoDB MapReduce:超过1000条记录未按预期工作,mongodb,mapreduce,Mongodb,Mapreduce,我编写了一个mapreduce函数,其中记录以以下格式发出 {userid:<xyz>, {event:adduser, count:1}} {userid:<xyz>, {event:login, count:1}} {userid:<xyz>, {event:login, count:1}} {userid:<abc>, {event:adduser, count:1}} {userid:<xyz>,{events: [{addu
{userid:<xyz>, {event:adduser, count:1}}
{userid:<xyz>, {event:login, count:1}}
{userid:<xyz>, {event:login, count:1}}
{userid:<abc>, {event:adduser, count:1}}
{userid:<xyz>,{events: [{adduser:1},{login:2}], allEventCount:3}}
无法理解此未定义的来自何处,并且单个事件的总和小于allEventCount。集合中的所有文档都有非空字段event
,因此没有未定义的可能性
Mongo DB版本--2.2.1
环境——本地机器,无分片
在reduce函数中,为什么此操作失败result.events[n][ev]+=value.allEventCount代码>当类似操作result.allEventCount+=value.allEventCount时代码>通行证
约翰尼建议的正确答案
减少功能:
var reducefn = function(key,values){
var result = {totEvents:0, event:[]};
values.forEach(function(value){
value.event.forEach(function(eventElem){
var notfound=true;
for(var n = 0; n < result.event.length; n++){
eventObj = result.event[n];
for(ev in eventObj){
for(evv in eventElem){
if(ev==evv){
result.event[n][ev] += eventElem[evv];
notfound=false;
break;
}
}}
}
if(notfound==true){
result.event.push(eventElem);
}
});
result.totEvents += value.totEvents;
});
return result;
}
var reducefn=函数(键、值){
var result={totEvents:0,事件:[]};
values.forEach(函数(值){
value.event.forEach(函数(eventElem){
var notfound=true;
对于(var n=0;n
您从map
函数发出的对象的形状必须与从reduce
函数返回的对象相同,因为reduce
的结果可以在处理大量文档时反馈到reduce
因此,您需要更改您的emit
以如下方式发送文档:
{userid:,{events:[{adduser:1}],allEventCount:1}
{userid:,{events:[{login:1}],allEventCount:1}
然后相应地更新reduce
函数。谢谢@JohnyHK。这就是问题所在,我们现在已经纠正了。
{ "_id" : {...}, "value" :{"allEventCount" :30, "events" :[ { "undefined" : 1},
{"adduser" : 1 }, {"remove" : 3 }, {"training" : 1 }, {"adminlogin" : 1 },
{"downgrade" : 2 } ]} }
var reducefn = function(key,values){
var result = {totEvents:0, event:[]};
values.forEach(function(value){
value.event.forEach(function(eventElem){
var notfound=true;
for(var n = 0; n < result.event.length; n++){
eventObj = result.event[n];
for(ev in eventObj){
for(evv in eventElem){
if(ev==evv){
result.event[n][ev] += eventElem[evv];
notfound=false;
break;
}
}}
}
if(notfound==true){
result.event.push(eventElem);
}
});
result.totEvents += value.totEvents;
});
return result;
}