sql >> Databáze >  >> NoSQL >> MongoDB

Mongo:spočítá počet výskytů slov v sadě dokumentů

MapReduce může být dobrým řešením, které dokáže zpracovat dokumenty na serveru bez manipulace s klientem (protože na serveru DB neexistuje funkce pro rozdělení řetězce (otevřený problém).

Začněte s map funkce. V níže uvedeném příkladu (který pravděpodobně bude muset být robustnější) je každý dokument předán map funkce (jako this ). Kód hledá summary pole, a pokud tam je, napíše ho malými písmeny, rozdělí na mezeru a poté vydá 1 pro každé nalezené slovo.

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

Poté v reduce funkce, sečte všechny výsledky nalezené map a vrátí diskrétní součet pro každé slovo, které bylo emit výše.

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

Nakonec spusťte mapReduce:

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

Výsledky s vašimi ukázkovými daty:

> 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. Vynucení řízení přístupu na základě rolí pomocí ClusterControl

  2. Stackexchange.Redis proč ConnectionMultiplexer.Connect vytváří dvě klientská připojení?

  3. Jak se dotazovat na dokumenty pomocí pole _id v ovladači Java mongodb?

  4. Python &Redis:Osvědčené postupy aplikací pro manažery/pracovníky