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 }