Latest web development tutorials

MongoDB MapReduce

Map-Reduce es un modelo de computación, simplemente significa que la mayor parte del trabajo (datos) de descomposición (MAP) para llevar a cabo, a continuación, combinar los resultados en un resultado final (REDUCIR).

MongoDB proporciona un mapa-Reducir es muy flexible para el análisis de datos a gran escala también es bastante práctico.


comando MapReduce

La siguiente es la sintaxis básica del MapReduce:

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

Uso de las funciones de MapReduce para lograr las dos funciones Mapa y Reducir funciones, Mapa llamada a la función emiten (clave, valor), atravesar la colección en todos los registros, y el valor de la clave se pasa a la función Reducir para su procesamiento.

función de mapa debe llamar emiten (clave, valor) Devuelve pares.

Descripción de parámetros:

  • función de mapeo (generar secuencias de teclas como reducir los parámetros defunción): mapa.
  • reducir las funciones estadísticas, la tarea consiste en reducir los valores de las teclas de función en un valor clave, es decir, la matriz de valores en un solo valor de valor..
  • a cabo los resultados estadísticos conjunto almacenados (no se especifica el uso de colección temporal elimina automáticamente después de que se desconecta un cliente).
  • una condición de filtro deconsulta, sólo para cumplir con las condiciones del documento se denominará función de mapa.(Query.limit, una especie puede mezclar)
  • tipo y vinculante sort parámetro (también ex documento enviado a la función de mapa para ordenar) límite, se puede optimizar el mecanismo de agrupación
  • limitar el número de los documentos enviados al límite superior de la función de mapa (si no hay límite, solo tipo de poco uso)

uso de MapReduce

Considere la siguiente estructura de documento para almacenar artículos, documentos del usuario, y almacena el campo de estado de usuario nombre_usuario artículo:

>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "w3big",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "w3big",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "w3big",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })

Ahora vamos a utilizar los postes colocados función de MapReduce para seleccionar un artículo publicado (el estado: "activo"), y por el paquete nombre_usuario calcula para cada usuario Mensajes:

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

Por encima de MapReduce salida es:

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

Los resultados mostraron que un total de cuatro coincide con los criterios de la consulta (estado: "activos") generaron cuatro documentos clave en la función de mapas en el documento, y luego usar la misma función clave para reducir divididos en dos grupos.

Los parámetros específicos:

  • resultado: almacenar los resultados del nombre de la colección, se trata de un conjunto temporal detrás de la conexión automática de MapReduce se ha eliminado.
  • timeMillis: ejecución requiere tiempo, en milisegundos
  • entrada: el número de condición del documento se envía a la función de mapa
  • emitir: veces en función de mapa emiten se llama, es decir, la cantidad total de toda la colección de datos
  • ouput: Resultados Número de documentos de la colección (recuento es muy útil para la depuración)
  • ok: el éxito, el éxito 1
  • ERR: Si falla, puede haber una razón para fallar, pero a partir de la experiencia, la razón es vaga, no muy útil

Usando el operador hallazgo para ver el resultado de la consulta de MapReduce:

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

Los resultados de la consulta anterior se muestra a continuación, hay dos usuarios tom y marcan dos artículos publicados:

{ "_id" : "mark", "value" : 4 }
{ "_id" : "w3big", "value" : 1 }

De una manera similar, MapReduce se puede utilizar para construir consultas agregados grandes y complejos.

Mapa de función y reducir las funciones se pueden implementar utilizando JavaScript, MapReduce hacer uso de muy flexible y potente.