Jeg tror, jeg har opdaget problemet. Overvej følgende inputdata:
{_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"
Denne fejlmeddelelse angiver, at MR i øjeblikket ikke kan bruges til at returnere en række værdier. Hvis du tager et kig på din reduktionsfunktion:
reduce = function(key, values) {
return values;
}
"værdier" vil være en matrix af "array.length" grupperet efter nøgle. Da nøglen "a,b,c" blev udsendt to gange (den samme logik følger for flere dokumenter med ""), er værdier (i mit eksempel) et array med to elementer, og MR kan ikke returnere arrays.
Hvis der udsendes et enkelt dokument for en bestemt nøgle (hvilket er tilfældet for _id:1), vil reduktionsfunktionen ikke blive kaldt. Dette forklarer, hvorfor du ikke får en fejlmeddelelse, når du ikke udsender null-tegn.
For at få denne MR-operation til at fungere, skal du udsende et enkelt dokument for {tegn:""}. Hvis du giver yderligere oplysninger om dine data, kan vi muligvis hjælpe med at finde løsninger.
EDIT:
Følgende reduktionsfunktion vil sikre, at en enkelt værdi i stedet for et array returneres:
reduce = function(key, values) {
return values[0];
}
EDIT 2:
For at forhindre fejlen, "errmsg" :"undtagelse:kortkald mislykkedes:JS Error:TypeError:this.characters har ingen egenskaber nofile_b:1", "code" :9014...
map = function() {
if (this.characters != null){
var array = this.characters.split(',');
emit(this.characters, array.length);
}
}