sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo:räkna antalet ordförekomster i en uppsättning dokument

MapReduce kan vara en bra passform som kan bearbeta dokumenten på servern utan att göra manipulation på klienten (eftersom det inte finns en funktion för att dela en sträng på DB-servern (öppet problem).

Börja med map fungera. I exemplet nedan (som sannolikt måste vara mer robust) skickas varje dokument till map funktion (som this ). Koden letar efter summary fält och om det finns där, gemener det, delas upp på ett mellanslag och avger sedan en 1 för varje hittat ord.

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
            }
        }
    }
};

Sedan, i reduce funktionen summerar den alla resultat som hittas av map funktion och returnerar en diskret summa för varje ord som var emit ovan.

var reduce = function( key, values ) {    
    var count = 0;    
    values.forEach(function(v) {            
        count +=v;    
    });
    return count;
}

Slutligen, kör mapReduce:

> db.so.mapReduce(map, reduce, {out: "word_count"})

Resultaten med dina exempeldata:

> 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 }


  1. MongoDB $subtrahera

  2. Frågar du med Redis?

  3. Toppmodern databashantering:ClusterControl - Guiden

  4. Flask-Mail och Redis Queue biblioteksintegration ger fel