sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongo:cuente el número de ocurrencias de palabras en un conjunto de documentos

MapReduce podría ser una buena opción que puede procesar los documentos en el servidor sin manipular el cliente (ya que no hay una función para dividir una cadena en el servidor de base de datos (problema abierto).

Comienza con el map función. En el siguiente ejemplo (que probablemente deba ser más sólido), cada documento se pasa al map función (como this ). El código busca el summary y si está allí, lo pone en minúsculas, lo divide en un espacio y luego emite un 1 por cada palabra encontrada.

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

Luego, en el reduce función, suma todos los resultados encontrados por el map función y devuelve un total discreto para cada palabra que fue emit ted arriba.

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

Finalmente, ejecute mapReduce:

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

Los resultados con sus datos de muestra:

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