MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongo:conta il numero di occorrenze di parole in un insieme di documenti

MapReduce potrebbe essere una buona soluzione per elaborare i documenti sul server senza eseguire manipolazioni sul client (poiché non esiste una funzione per dividere una stringa sul server DB (problema aperto).

Inizia con la map funzione. Nell'esempio seguente (che probabilmente deve essere più robusto), ogni documento viene passato alla map funzione (come this ). Il codice cerca il summary campo e se è presente, lo mette in minuscolo, lo divide su uno spazio e quindi emette un 1 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
            }
        }
    }
};

Quindi, nel reduce funzione, somma tutti i risultati trovati dalla map funzione e restituisce un totale discreto per ogni parola che era emit di cui sopra.

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

Infine, esegui mapReduce:

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

I risultati con i tuoi 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 }