MapReduce kan vara en bra passform som kan bearbeta dokumenten på servern utan att göra manipulation på klienten (eftersom det inte finns en funktion för att dela en sträng på DB-servern (öppet problem).
Börja med map
fungera. I exemplet nedan (som sannolikt måste vara mer robust) skickas varje dokument till map
funktion (som this
). Koden letar efter summary
fält och om det finns där, gemener det, delas upp på ett mellanslag och avger sedan en 1
för varje hittat ord.
var map = function() {
var summary = this.summary;
if (summary) {
// quick lowercase to normalize per your requirements
summary = summary.toLowerCase().split(" ");
for (var i = summary.length - 1; i >= 0; i--) {
// might want to remove punctuation, etc. here
if (summary[i]) { // make sure there's something
emit(summary[i], 1); // store a 1 for each word
}
}
}
};
Sedan, i reduce
funktionen summerar den alla resultat som hittas av map
funktion och returnerar en diskret summa för varje ord som var emit
ovan.
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Slutligen, kör mapReduce:
> db.so.mapReduce(map, reduce, {out: "word_count"})
Resultaten med dina exempeldata:
> db.word_count.find().sort({value:-1})
{ "_id" : "is", "value" : 3 }
{ "_id" : "bad", "value" : 2 }
{ "_id" : "good", "value" : 2 }
{ "_id" : "this", "value" : 2 }
{ "_id" : "neither", "value" : 1 }
{ "_id" : "or", "value" : 1 }
{ "_id" : "something", "value" : 1 }
{ "_id" : "that", "value" : 1 }