MapReduce kan være en god pasform, der kan behandle dokumenterne på serveren uden at foretage manipulation på klienten (da der ikke er en funktion til at opdele en streng på DB-serveren (åbent problem).
Start med map
fungere. I eksemplet nedenfor (som sandsynligvis skal være mere robust), sendes hvert dokument til map
funktion (som this
). Koden leder efter summary
felt, og hvis det er der, skal du skrive det med små bogstaver, opdeles på et mellemrum og derefter udsende en 1
for hvert ord fundet.
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
}
}
}
};
Derefter i reduce
funktion, opsummerer den alle resultater fundet af map
funktion og returnerer en diskret total for hvert ord, der var emit
ted ovenfor.
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Til sidst skal du udføre mapReduce:
> db.so.mapReduce(map, reduce, {out: "word_count"})
Resultaterne med dine prøvedata:
> 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 }