MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongo:Zählen Sie die Anzahl der Wortvorkommen in einer Reihe von Dokumenten

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 }