MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Hai un problema durante la divisione e il conteggio dei dati in un CSV in MONGODB (con valori Null in colonne come nomecolonna:)

Penso di aver scoperto il problema. Considera i seguenti dati di input:

{_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"

Questo messaggio di errore indica che attualmente MR non può essere utilizzato per restituire una matrice di valori. Se dai un'occhiata alla tua funzione di riduzione:

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

"values" sarà un array di "array.length" raggruppati per chiave. Poiché la chiave "a, b, c" è stata emessa due volte (la stessa logica segue per più documenti con ""), i valori (nel mio esempio) sono un array con due elementi e MR non può restituire array.

Se viene emesso un singolo documento per una chiave particolare (come nel caso di _id:1), la funzione di riduzione non verrà chiamata. Questo spiega perché non ricevi un messaggio di errore quando non emetti caratteri nulli.

Per far funzionare questa operazione MR, devi emettere un singolo documento per {characters:""}. Se fornisci ulteriori informazioni sui tuoi dati, potremmo essere in grado di aiutarti a trovare soluzioni alternative.

MODIFICA:

La seguente funzione di riduzione assicurerà che venga restituito un singolo valore, anziché un array:

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

EDIT 2:

Per evitare l'errore, "errmsg" :"exception:map invoke failed:JS Error:TypeError:this.characters non ha proprietà nofile_b:1", "code" :9014...

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