Załączony plik .tsv zawiera 4 książki z Project Gutenberg.
Ładujemy go do MongoDB
mongoimport --db gutenberg --collection books --type tsv --headerline < gutenberg_books.tsv
Powstaje piękna kolekcja books:
db.books.find().limit(10).pretty()
Próbuję napisać mapReduce, który zliczy znaki w p, dla każdej ksiązki.
m=function(){emit(this.title,this.p);};
r=function(key,values){
zlicz=0
for (x in values){
zlicz += values[x].length};
return zlicz};
db.books.mapReduce(m,r,{out:{inline:1}});
Tylko wynik jest taki:
{
"results" : [
{
"_id" : "The Idiot",
"value" : NaN
},
{
"_id" : "The Man Who Knew Too Much",
"value" : NaN
},
{
"_id" : "The Sign of the Four",
"value" : NaN
},
{
"_id" : "War and Peace",
"value" : NaN
}
],
"timeMillis" : 117,
"counts" : {
"input" : 18786,
"emit" : 18786,
"reduce" : 193,
"output" : 4
},
"ok" : 1
}
Jak ewentualnie usunę + z funkcji r po zlicz, to wynikiem będzie ilość znaków z ostatniego akapitu każdej książki. Czyli niby działa. Ale nie sumuje wszystkich akapitów. A może po zliczeniu jest tego za dużo?
Co robię źle? Jakiegoś forEach trzeba dodać?
Kolejna sprawa, to napisanie mapReduce, który dla każdej ksiązki zliczy tylko litery w p. Ale tu nawet nie zacząłem skoro z tym pierwszym nie pykło.
Będę wdzięczny za pomoc.