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 }