Ich glaube ich habe das Problem entdeckt. Betrachten Sie die folgenden Eingabedaten:
{_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"
Diese Fehlermeldung weist darauf hin, dass MR derzeit nicht verwendet werden kann, um ein Array von Werten zurückzugeben. Wenn Sie sich Ihre Reduce-Funktion ansehen:
reduce = function(key, values) {
return values;
}
"values" ist ein Array von "array.length", die nach Schlüsseln gruppiert sind. Da der Schlüssel "a,b,c" zweimal ausgegeben wurde (die gleiche Logik folgt für mehrere Dokumente mit ""), handelt es sich bei values (in meinem Beispiel) um ein Array mit zwei Elementen, und MR kann keine Arrays zurückgeben.
Wenn ein einzelnes Dokument für einen bestimmten Schlüssel ausgegeben wird (was bei _id:1 der Fall ist), wird die Reduce-Funktion nicht aufgerufen. Dies erklärt, warum Sie keine Fehlermeldung erhalten, wenn Sie keine Nullzeichen ausgeben.
Damit dieser MR-Vorgang funktioniert, müssen Sie ein einzelnes Dokument für {Zeichen:""} ausgeben. Wenn Sie zusätzliche Informationen zu Ihren Daten bereitstellen, können wir möglicherweise helfen, Problemumgehungen zu finden.
BEARBEITEN:
Die folgende Reduce-Funktion stellt sicher, dass ein einzelner Wert statt eines Arrays zurückgegeben wird:
reduce = function(key, values) {
return values[0];
}
BEARBEITEN 2:
Um den Fehler zu verhindern, "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);
}
}