Myslím, že jsem problém objevil. Zvažte následující vstupní data:
{_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"
Tato chybová zpráva označuje, že MR aktuálně nelze použít k vrácení pole hodnot. Pokud se podíváte na svou funkci snížení:
reduce = function(key, values) {
return values;
}
"values" bude pole "array.length" seskupených podle klíče. Protože klíč "a,b,c" byl vydán dvakrát (stejná logika platí pro více dokumentů s ""), hodnoty (v mém příkladu) jsou pole se dvěma prvky a MR nemůže vrátit pole.
Pokud je pro konkrétní klíč vygenerován jeden dokument (což je případ _id:1), funkce snížení se nezavolá. To vysvětluje, proč se vám nezobrazí chybová zpráva, když nevydáte prázdné znaky.
Aby tato operace MR fungovala, musíte vygenerovat jeden dokument pro {znaky:""}. Pokud poskytnete další informace o svých datech, můžeme vám pomoci najít náhradní řešení.
EDIT:
Následující funkce snížení zajistí, že bude vrácena jedna hodnota, nikoli pole:
reduce = function(key, values) {
return values[0];
}
EDITACE 2:
Chcete-li zabránit chybě, "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);
}
}