Myślę, że odkryłem problem. Rozważ następujące dane wejściowe:
{_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"
Ten komunikat o błędzie wskazuje, że obecnie nie można użyć MR do zwrócenia tablicy wartości. Jeśli spojrzysz na swoją funkcję zmniejszania:
reduce = function(key, values) {
return values;
}
„values” będzie tablicą „array.length” pogrupowaną według klucza. Ponieważ klucz "a,b,c" został wyemitowany dwukrotnie (ta sama logika obowiązuje dla wielu dokumentów z ""), wartości (w moim przykładzie) to tablica z dwoma elementami, a MR nie może zwracać tablic.
Jeśli pojedynczy dokument jest emitowany dla określonego klucza (co ma miejsce w przypadku _id:1), funkcja Reduce nie zostanie wywołana. To wyjaśnia, dlaczego nie pojawia się komunikat o błędzie, gdy nie emitujesz znaków null.
Aby ta operacja MR działała, musisz wyemitować pojedynczy dokument dla {znaków:""}. Jeśli podasz dodatkowe informacje o swoich danych, możemy pomóc w znalezieniu obejścia.
EDYCJA:
Poniższa funkcja zmniejszania zapewni, że zostanie zwrócona pojedyncza wartość, a nie tablica:
reduce = function(key, values) {
return values[0];
}
EDYCJA 2:
Aby zapobiec błędowi, "errmsg" :"wyjątek:wywołanie mapy nie powiodło się:Błąd JS:TypeError:this.characters nie ma właściwości nofile_b:1", "code" :9014...
map = function() {
if (this.characters != null){
var array = this.characters.split(',');
emit(this.characters, array.length);
}
}