MongoDB – Mapa Reducir

En MongoDB, map-reduce es un modelo de programación de procesamiento de datos que ayuda a realizar operaciones en grandes conjuntos de datos y produce resultados agregados. MongoDB proporciona la función mapReduce() para realizar las operaciones de reducción de mapas. Esta función tiene dos funciones principales, es decir, función de mapa y función de reducción. La función map se utiliza para agrupar todos los datos según el valor-clave y la función reduce se utiliza para realizar operaciones en los datos mapeados. Por lo tanto, los datos se asignan y reducen de forma independiente en diferentes espacios y luego se combinan en la función y el resultado se guardará en la nueva colección especificada. Esta función mapReduce() generalmente operaba solo en grandes conjuntos de datos. Usando Map Reduce puede realizar operaciones de agregación como max, avg en los datos usando alguna clave y es similar a groupBy en SQL. Actúa sobre los datos de forma independiente y paralela. Tratemos de entender mapReduce() usando el siguiente ejemplo:

En este ejemplo, tenemos cinco registros de los que debemos sacar las máximas notas de cada sección y las claves son id, sec, notas.

{"id":1, "sec":A, "marks":80}
{"id":2, "sec":A, "marks":90}
{"id":1, "sec":B, "marks":99}
{"id":1, "sec":B, "marks":95}
{"id":1, "sec":C, "marks":90}

Aquí tenemos que encontrar las notas máximas en cada sección. Entonces, nuestra clave por la cual agruparemos los documentos es la clave sec y el valor será marcas. Dentro de la función map, usamos la función emit(this.sec, this.marks), y devolveremos el segundo y las marcas de cada registro (documento) de la función emit. Esto es similar al grupo Por MySQL.

var map = function(){emit(this.sec, this.marks)};

Después de iterar sobre cada documento, la función Emit devolverá los datos de esta manera:

{“A”:[80, 90]}, {“B”:[99, 90]}, {“C”:[90] } 

y hasta este punto es lo que hace la función map(). Los datos proporcionados por la función de emisión se agrupan por tecla sec. Ahora estos datos se ingresarán en nuestra función de reducción. La función Reducir es donde tiene lugar la agregación real de datos. En nuestro ejemplo, elegiremos el Max de cada sección como para sec A:[80, 90] = 90 (Max) B:[99, 90] = 99 (max), C:[90] = 90(max).

var reduce = function(sec,marks){return Array.max(marks);};

Aquí, en la función reduce(), hemos reducido los registros ahora, los enviaremos a una nueva colección. {out: «nombre de la colección»}

db.collectionName.mapReduce(map,reduce,{out :"collectionName"});

En la consulta anterior ya hemos definido el mapa, reduce. Luego, para verificar, debemos buscar en la colección recién creada. Podemos usar la consulta db.collectionName.find() que obtenemos:

{"id":"A", value:90}
{"id":"B", value:99}
{"id":"C", value:90}

Sintaxis: 

db.collectionName.mapReduce(
... map(),
...reduce(),
...query{},
...output{}
);

Aquí,

  • Función map(): utiliza la función emit() en la que toma dos parámetros clave y clave de valor. Aquí la clave está en que hacemos grupos como grupos en MySQL. Ejemplo como agrupar por edades o nombres y el segundo parámetro es sobre el cual se realiza la agregación como avg(), se calcula sum().
  • función reduce(): Es el paso en el que realizamos nuestra función agregada como avg(), sum().
  • consulta: Aquí pasaremos la consulta para filtrar el conjunto de resultados.
  • salida: En este, especificaremos el nombre de la colección donde se almacenará el resultado.

Ejemplo 1:

En este ejemplo, estamos trabajando con:

Base de datos: geeksforgeeks2

Colección: empleado

Documentos: Seis documentos que contienen los detalles de los empleados

  • Encuentre la suma de rangos agrupados por edades:
var map=function(){ emit(this.age,this.rank)};
var reduce=function(age,rank){ return Array.sum(rank);};
db.employee.mapReduce(map,reduce,{out :"resultCollection1"});

Aquí, calcularemos la suma del rango presente dentro del grupo de edad particular. Ahora la edad es nuestra clave en la que realizaremos el grupo por (como en MySQL) y el rango será la clave en la que realizaremos la agregación de la suma.

  • Función Insidemap(), es decir, map() : function map(){ emit(this.age,this.rank);}; escribiremos la función emit(this.age,this.rank) . Aquí esto representa la colección actual que se está iterando y la primera clave es la edad usando la edad agruparemos el resultado como si la edad de 24 proporcione la suma de todos los rangos o la edad de 25 proporcione la suma de todos los rangos y el segundo argumento es el rango en el que se agrega será realizado.
  • Dentro de la función reduce, es decir, reduce(): function reduce(key,rank){ return Array.sum(rank); }; realizaremos la función de agregación.
  • Ahora se generará el tercer parámetro donde definiremos la colección donde se guardará el resultado, es decir, {out:”resultCollection1″} . Aquí, out representa la clave cuyo valor es el nombre de la colección donde se guardará el resultado.

  • Realización de la agregación avg() en el rango agrupado por edades:
var map=function(){ emit(this.age,this.rank)};
var reduce=function(age,rank){ return Array.avg(rank);};
db.employee.mapReduce(map,reduce,{out :"resultCollection3"});
db.resultCollection3.find()

En este ejemplo, calcularemos el promedio de los rangos agrupados por edad. Asi que, 

  • map(): Función map(){ emit(this.age, this.rank)};. Aquí la edad es la clave por la cual agruparemos y la clasificación es la clave en la que se realizará la agregación avg().
  • reduce(): función reduce (edad, rango) { return Array.avg (rango) l};
  • salida: {salida:”resultCollection3″}

¿Cuándo usar Map-Reduce?

En MongoDB, puede usar Map-reduce cuando su consulta de agregación es lenta porque hay una gran cantidad de datos y la consulta de agregación tarda más en procesarse. Entonces, al usar map-reduce, puede realizar acciones más rápido que la consulta de agregación. 

Publicación traducida automáticamente

Artículo escrito por rajatagrawal5 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *