MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongo:conte o número de ocorrências de palavras em um conjunto de documentos


MapReduce pode ser um bom ajuste que pode processar os documentos no servidor sem fazer manipulação no cliente (já que não há um recurso para dividir uma string no servidor de banco de dados (problema em aberto).

Comece com o map função. No exemplo abaixo (que provavelmente precisa ser mais robusto), cada documento é passado para o map função (como this ). O código procura o summary campo e, se estiver lá, coloque-o em letras minúsculas, divida em um espaço e emite um 1 para cada palavra 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
            }
        }
    }
};

Então, no reduce função, ele soma todos os resultados encontrados pelo map função e retorna um total discreto para cada palavra que foi emit ted acima.
var reduce = function( key, values ) {    
    var count = 0;    
    values.forEach(function(v) {            
        count +=v;    
    });
    return count;
}

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

Os resultados com seus dados de amostra:
> 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 }