Este sistema es ejecutado directamente en el lado del servidor, por lo que no tenemos que descargar previamente los datos que deseamos manipular. En MapReduce definimos funciones en JavaScript para manipular dichos datos, estas funciones se basan en los conceptos:
- Map() Usada para agrupar los datos a manipular en forma de par - valor, uniendo todos los pares con la misma clave en un mismo grupo, con esto indicamos mediante una función JavaScript que datos son los que deseamos usar.
- Reduce() Esta función recibe de Map() cada grupo de claves y una matriz con los valores por cada grupo, para poderlos poderlos tratar y devolver un valor único.
Veamos como trabajar con MapReduce, con una base de datos real. Para ello vamos a descargarnos la base de datos de spotify en el que aparezcan las entradas de "Enrique Bunbury" en JSON y vamos a mostrar todos los albunes que tienen como fecha el 2010.
wget http://ws.spotify.com/search/1/track.json?q=enrique+bunbury
Una vez descargado el fichero, lo editamos y eliminamos de la primera linea lo siguiente:
{"info": {"num_results": 25, "limit": 100, "offset": 0, "query": "enrique bunbury", "type": "track", "page": 1},
Aasegurandonos que nuestro fichero comience por:
{"album": {"released": ...
y que finalice por: "track-number": "11"}
Desde aqui nos podemos descargar el fichero json que vamos importar para realizar el ejemplo.
mongoimport --db spotify --collection EnriqueBunbury --jsonArray --type json track.json?q=enrique+bunbury
Una vez tenemos preparada nuestra base de datos llamada spotify y nuestra colección EnriqueBunbury, vamos a proceder a crear las funciones map y reduce.
map = function() {
for(var key in this.album) {
if (key == 'released'){
if (this.album[key] == 2010){
emit(this.album['name'],1)
}
}
}
}
reduce = function(key, values) {
return this;
}
Con esta base de datos tenemos que tener en cuenta que contiene subdocumentos, como podemos observar en la siguiente imagen <album> disponemos todos los datos referente al album.
Una vez tenemos creada las dos funciones, vamos a proceder a ejecutarlas:
db.EnriqueBunbury.mapReduce(map, reduce, {out: { inline : 1}})
Cuando estemos trabajando con MapReduce o JavaScript en MongoDB, os recomiendo tener una consola abierta mostrando el log de mongo para ir depurando los resultado, de esta forma vamos ahorrar muchísimo tiempo.
tail -f /var/log/mongo/mongod.log



Muchas gracias por tu excelente Post, tengo una pregunta donde guardo las funciones mapreduce de javascript
ResponderEliminarHola Carlos las funciones las puedes guardar en un fichero javascript donde quieras, luego puedes cargar haciendo load("/RUTA/script.js") aunque la ruta por defecto de mongodb es /data/db/scripts te valdria con usar la ruta absoluta LOAD(scripts/scrupt.js).
EliminarEspero que te haya ayudado.
Un saludo.