Мисля, че открих проблема. Разгледайте следните входни данни:
{_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"
Това съобщение за грешка показва, че MR в момента не може да се използва за връщане на масив от стойности. Ако погледнете вашата функция за намаляване:
reduce = function(key, values) {
return values;
}
"values" ще бъде масив от "array.length", групирани заедно по ключ. Тъй като ключът "a,b,c" е излъчен два пъти (следва същата логика за множество документи с ""), стойностите (в моя пример) са масив с два елемента и MR не може да върне масиви.
Ако единичен документ е излъчен за определен ключ (какъвто е случаят с _id:1), функцията за намаляване няма да бъде извикана. Това обяснява защо не получавате съобщение за грешка, когато не излъчвате нулеви знаци.
За да работи тази MR операция, трябва да излъчите един документ за {characters:""}. Ако предоставите допълнителна информация за вашите данни, може да сме в състояние да ви помогнем да намерите заобиколни решения.
РЕДАКТИРАНЕ:
Следната функция за намаляване ще гарантира, че се връща една стойност, а не масив:
reduce = function(key, values) {
return values[0];
}
РЕДАКТИРАНЕ 2:
За да предотвратите грешката, "errmsg" :"exception:map invoke failed:JS Error:TypeError:this.characters няма свойства nofile_b:1", "code" :9014...
map = function() {
if (this.characters != null){
var array = this.characters.split(',');
emit(this.characters, array.length);
}
}