MongoDB MapReduce: no funciona como se esperaba en más de 1000 registros

Escribí una función mapreduce donde los registros se emiten en el siguiente formato

{userid:<xyz>, {event:adduser, count:1}}
{userid:<xyz>, {event:login, count:1}}
{userid:<xyz>, {event:login, count:1}}
{userid:<abc>, {event:adduser, count:1}}

donde userid es la clave y el resto es el valor para esa clave. Después de la función MapReduce, quiero obtener el resultado en el siguiente formato

{userid:<xyz>,{events: [{adduser:1},{login:2}], allEventCount:3}}

Para lograr esto, escribí la siguiente función de reducción. Sé que esto se puede lograr por grupo tanto en el marco de agregación como en mapreduce, pero necesitamos una funcionalidad similar para un escenario complejo. Por lo tanto, estoy tomando este enfoque.

var reducefn = function(key,values){
var result = {allEventCount:0, events:[]};
values.forEach(function(value){
    var notfound=true;
    for(var n = 0; n < result.events.length; n++){
        eventObj = result.events[n];
        for(ev in eventObj){
            if(ev==value.event){
                result.events[n][ev] += value.allEventCount;
                notfound=false;
                break;
            }
        }
    }
    if(notfound==true){ 
        var newEvent={}
        newEvent[value.event]=1; 
        result.events.push(newEvent);
    }
    result.allEventCount += value.allEventCount;
});
return result;

}

Esto funciona perfectamente, cuando corro para 1000 registros, cuando hay registros de 3k o 10k, el resultado que obtengo es algo como esto

{ "_id" : {...}, "value" :{"allEventCount" :30, "events" :[ { "undefined" : 1},
{"adduser" : 1 }, {"remove" : 3 }, {"training" : 1 }, {"adminlogin" : 1 }, 
{"downgrade" : 2 } ]} }

No puedo entender donde estaundefined vino de y también la suma de los eventos individuales es menor que allEventCount. Todos los documentos de la colección tienen un campo no vacío.event así que no hay posibilidad de indefinido.

Versión de Mongo DB - 2.2.1 Entorno - Máquina local, sin fragmentación.

En la función de reducción, ¿por qué debería fallar esta operación?result.events[n][ev] += value.allEventCount; cuando la operación similarresult.allEventCount += value.allEventCount; pasa?

La respuesta corregida sugerida por johnyHK

Reducir la función:

    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;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta