Ik denk dat ik het probleem heb ontdekt. Houd rekening met de volgende invoergegevens:
{_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"
Dit foutbericht geeft aan dat MR momenteel niet kan worden gebruikt om een reeks waarden te retourneren. Als je naar je reduceerfunctie kijkt:
reduce = function(key, values) {
return values;
}
"values" is een array van "array.length"s gegroepeerd op sleutel. Omdat de sleutel "a,b,c" twee keer is verzonden (dezelfde logica volgt voor meerdere documenten met ""), zijn waarden (in mijn voorbeeld) een array met twee elementen en kan MR geen arrays retourneren.
Als een enkel document wordt verzonden voor een bepaalde sleutel (wat het geval is voor _id:1), wordt de reduceerfunctie niet aangeroepen. Dit verklaart waarom je geen foutmelding krijgt als je geen null-tekens uitstuurt.
Om deze MR-bewerking te laten werken, moet u een enkel document verzenden voor {karakters:""}. Als u aanvullende informatie over uw gegevens verstrekt, kunnen we u wellicht helpen bij het vinden van tijdelijke oplossingen.
BEWERKEN:
De volgende reduceerfunctie zorgt ervoor dat een enkele waarde, in plaats van een array, wordt geretourneerd:
reduce = function(key, values) {
return values[0];
}
EDIT 2:
Om de fout te voorkomen, "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);
}
}