MapReduce könnte eine gute Lösung sein, die die Dokumente auf dem Server verarbeiten kann, ohne den Client zu manipulieren (da es keine Funktion zum Teilen einer Zeichenfolge auf dem DB-Server gibt (offenes Problem).
Beginnen Sie mit der map
Funktion. Im folgenden Beispiel (das wahrscheinlich robuster sein muss) wird jedes Dokument an die map
übergeben Funktion (als this
). Der Code sucht nach der summary
Feld und wenn es da ist, wird es klein geschrieben, bei einem Leerzeichen geteilt und dann ein 1
ausgegeben für jedes gefundene Wort.
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
}
}
}
};
Dann im reduce
Funktion, summiert sie alle Ergebnisse, die von map
gefunden wurden Funktion und gibt eine diskrete Summe für jedes Wort zurück, das emit
war ted oben.
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Führen Sie abschließend mapReduce:
aus> db.so.mapReduce(map, reduce, {out: "word_count"})
Die Ergebnisse mit Ihren Beispieldaten:
> 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 }