MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Avoir un problème lors de la division et compter les données dans un CSV dans MONGODB (avoir des valeurs nulles dans des colonnes comme nom de colonne :)

Je pense avoir découvert le problème. Considérez les données d'entrée suivantes :

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

Ce message d'erreur indique que MR ne peut actuellement pas être utilisé pour renvoyer un tableau de valeurs. Si vous jetez un œil à votre fonction de réduction :

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

"values" sera un tableau de "array.length" regroupés par clé. Étant donné que la clé "a,b,c" a été émise deux fois (la même logique suit pour plusieurs documents avec ""), les valeurs (dans mon exemple) sont un tableau à deux éléments et MR ne peut pas renvoyer de tableaux.

Si un seul document est émis pour une clé particulière (ce qui est le cas pour _id:1), la fonction reduce ne sera pas appelée. Cela explique pourquoi vous ne recevez pas de message d'erreur lorsque vous n'émettez pas de caractères nuls.

Pour que cette opération MR fonctionne, vous devez émettre un seul document pour {characters :""}. Si vous fournissez des informations supplémentaires sur vos données, nous pourrons peut-être vous aider à trouver des solutions de contournement.

MODIFIER :

La fonction de réduction suivante garantira qu'une seule valeur, plutôt qu'un tableau, est renvoyée :

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

ÉDITION 2 :

Pour éviter l'erreur, "errmsg" :"exception :l'invocation de la carte a échoué :erreur JS :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);
    } 
}