MapReduce potrebbe essere una buona soluzione per elaborare i documenti sul server senza eseguire manipolazioni sul client (poiché non esiste una funzione per dividere una stringa sul server DB (problema aperto).
Inizia con la map
funzione. Nell'esempio seguente (che probabilmente deve essere più robusto), ogni documento viene passato alla map
funzione (come this
). Il codice cerca il summary
campo e se è presente, lo mette in minuscolo, lo divide su uno spazio e quindi emette un 1
per ogni parola trovata.
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
}
}
}
};
Quindi, nel reduce
funzione, somma tutti i risultati trovati dalla map
funzione e restituisce un totale discreto per ogni parola che era emit
di cui sopra.
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Infine, esegui mapReduce:
> db.so.mapReduce(map, reduce, {out: "word_count"})
I risultati con i tuoi dati di esempio:
> 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 }