MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Tenha um problema ao dividir e contar os dados em um CSV no MONGODB (Tendo valores nulos em colunas como nome da coluna :)


Acho que descobri o problema. Considere os seguintes dados 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"

Esta mensagem de erro indica que o MR atualmente não pode ser usado para retornar uma matriz de valores. Se você der uma olhada na sua função de redução:
reduce = function(key, values) {
    return values;
}

"values" será um array de "array.length"s agrupados por chave. Como a chave "a,b,c" foi emitida duas vezes (a mesma lógica segue para vários documentos com ""), values ​​(no meu exemplo) é uma matriz com dois elementos e MR não pode retornar matrizes.

Se um único documento for emitido para uma chave específica (que é o caso de _id:1), a função reduce não será chamada. Isso explica por que você não recebe uma mensagem de erro quando não emite caracteres nulos.

Para que essa operação de MR funcione, você precisa emitir um único documento para {characters:""}. Se você fornecer informações adicionais sobre seus dados, poderemos ajudar a encontrar soluções alternativas.

EDITAR:

A seguinte função de redução garantirá que um único valor, em vez de uma matriz, seja retornado:
reduce = function(key, values) {
        return values[0];
}

EDIÇÃO 2:

Para evitar o erro, "errmsg" :"exception:map invoke failed:JS Error:TypeError:this.characters has no properties nofile_b:1", "code" :9014...
map = function() { 
    if (this.characters != null){ 
         var array = this.characters.split(','); 
         emit(this.characters, array.length);
    } 
}