MapReduce potrebbe essere una buona soluzione che può elaborare i documenti sul server senza fare manipolazioni sul client (in quanto non esiste una funzionalità da dividere una stringa sul server DB (open issue).
Inizia con la funzione map
. nell'esempio che segue (che probabilmente ha bisogno di essere più robusto), ogni documento viene passato alla funzione map
(come this
). l'aspetto di codice per il campo summary
e, se è presente, lo mette in minuscolo, si divide in uno spazio e quindi emette un valore 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
}
}
}
};
Poi, nella funzione reduce
, le somme tutti i risultati trovati dalla funzione map
e restituisce un totale discreto per ogni parola che era emit
ta sopra.
var reduce = function(key, values) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Infine, eseguire il MapReduce:
> db.so.mapReduce(map, reduce, {out: "word_count"})
I risultati con i 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 }
Wow ... la mappa/ridurre parte di Mongo è molto più facile da capire di quanto temessi. Grazie per aver fornito una così grande risposta! –