MongoDB - Reducir mapa

Según la documentación de MongoDB, Map-reducees un paradigma de procesamiento de datos para condensar grandes volúmenes de datos en resultados agregados útiles. Usos de MongoDBmapReducecomando para operaciones de reducción de mapas. MapReduce se usa generalmente para procesar grandes conjuntos de datos.

Comando MapReduce

A continuación se muestra la sintaxis del comando mapReduce básico:

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction}, {   //reduce function
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

La función map-reduce primero consulta la colección, luego asigna los documentos de resultado para emitir pares clave-valor, que luego se reduce en función de las claves que tienen múltiples valores.

En la sintaxis anterior:

  • map es una función javascript que asigna un valor con una clave y emite un par clave-valor

  • reduce es una función de javascript que reduce o agrupa todos los documentos que tienen la misma clave

  • out especifica la ubicación del resultado de la consulta map-reduce

  • query especifica los criterios de selección opcionales para seleccionar documentos

  • sort especifica los criterios de clasificación opcionales

  • limit especifica el número máximo opcional de documentos a devolver

Usando MapReduce

Considere la siguiente estructura de documento que almacena publicaciones de usuarios. El documento almacena el nombre de usuario del usuario y el estado de la publicación.

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

Ahora, usaremos una función mapReduce en nuestro posts colección para seleccionar todas las publicaciones activas, agruparlas según el nombre de usuario y luego contar el número de publicaciones de cada usuario usando el siguiente código:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
	
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
)

La consulta mapReduce anterior genera el siguiente resultado:

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

El resultado muestra que un total de 4 documentos coincidieron con la consulta (estado: "activo"), la función de mapa emitió 4 documentos con pares clave-valor y, finalmente, la función de reducción agrupó documentos mapeados que tienen las mismas claves en 2.

Para ver el resultado de esta consulta mapReduce, use el operador de búsqueda -

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
	
).find()

La consulta anterior da el siguiente resultado que indica que ambos usuarios tom y mark tener dos puestos en estado activo -

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

De manera similar, las consultas de MapReduce se pueden utilizar para construir consultas de agregación complejas de gran tamaño. El uso de funciones personalizadas de Javascript hace uso de MapReduce, que es muy flexible y potente.