sql >> Base de Datos >  >> NoSQL >> MongoDB

Tiene un problema al dividir y contar los datos en un CSV en MONGODB (Tener valores nulos en columnas como nombre de columna :)

Creo que he descubierto el problema. Considere los siguientes datos de entrada:

{_id: 1, characters: ""}
{_id: 2, characters: "a, b, c"}
{_id: 3, characters: "a, b, c"}

> db.collection.mapReduce(map, reduce, {out: { inline : 1}})
"exception: reduce -> multiple not supported yet"

Este mensaje de error indica que MR actualmente no se puede usar para devolver una matriz de valores. Si echas un vistazo a tu función de reducción:

reduce = function(key, values) {
    return values;
}

Los "valores" serán una matriz de "array.length" agrupados por clave. Dado que la clave "a, b, c" se emitió dos veces (se sigue la misma lógica para varios documentos con ""), los valores (en mi ejemplo) son una matriz con dos elementos, y MR no puede devolver matrices.

Si se emite un único documento para una clave en particular (que es el caso de _id:1), no se llamará a la función de reducción. Esto explica por qué no recibe un mensaje de error cuando no emite caracteres nulos.

Para que esta operación de MR funcione, debe emitir un único documento para {caracteres:""}. Si proporciona información adicional sobre sus datos, es posible que podamos ayudarlo a encontrar soluciones alternativas.

EDITAR:

La siguiente función de reducción garantizará que se devuelva un solo valor, en lugar de una matriz:

reduce = function(key, values) {
        return values[0];
}

EDICIÓN 2:

Para evitar el error, "errmsg":"excepción:la invocación del mapa falló:Error JS:TypeError:this.characters no tiene propiedades nofile_b:1", "code":9014...

map = function() { 
    if (this.characters != null){ 
         var array = this.characters.split(','); 
         emit(this.characters, array.length);
    } 
}