sql >> Base de Datos >  >> NoSQL >> MongoDB

Comparación de agregación de MongoDB:group(), $group y MapReduce

Es algo confuso ya que los nombres son similares, pero el group() El comando es una característica e implementación diferente del $group operador de tubería en el marco de agregación.

El comando group(), Aggregation Framework y MapReduce son colectivamente características de agregación de MongoDB. Hay cierta superposición en las características, pero intentaré explicar las diferencias y limitaciones de cada una como en MongoDB 2.2.0.

Nota:conjuntos de resultados en línea mencionados a continuación se refieren a consultas que se procesan en la memoria con resultados devueltos al final de la llamada a la función. Las opciones de salida alternativas (actualmente solo disponibles con MapReduce) podrían incluir guardar los resultados en una colección nueva o existente.

group() Comando

  • Sintaxis simple y funcionalidad para agrupar... análoga a GROUP BY en SQL.

  • Devuelve el conjunto de resultados en línea (como una matriz de elementos agrupados).

  • Implementado usando el motor de JavaScript; personalizado reduce() las funciones se pueden escribir en JavaScript.

  • Limitaciones actuales

    • No se agrupará en un conjunto de resultados con más de 20 000 claves.

    • Los resultados deben ajustarse a las limitaciones de un documento BSON (actualmente 16 MB).

    • Toma un bloqueo de lectura y no permite que ningún otro subproceso ejecute JavaScript mientras se está ejecutando.

    • No funciona con colecciones fragmentadas.

  • Ver también:ejemplos de comandos group() .

MapaReducir

  • Implementa el modelo MapReduce para procesar grandes conjuntos de datos.

  • Puede elegir entre una de varias opciones de salida (en línea, nueva colección, fusionar, reemplazar, reducir)

  • Las funciones de MapReduce están escritas en JavaScript.

  • Admite colecciones de entrada fragmentadas y no fragmentadas.

  • Se puede utilizar para la agregación incremental en grandes colecciones.

  • MongoDB 2.2 implementa un soporte mucho mejor para el mapa fragmentado reduce la salida.

  • Limitaciones actuales

    • Una sola emisión solo puede contener la mitad del tamaño máximo de documento BSON de MongoDB (16 MB).

    • Hay un bloqueo de JavaScript, por lo que un servidor mongod solo puede ejecutar una función de JavaScript a la vez. Sin embargo, la mayoría de los pasos de MapReduce son muy cortos, por lo que los bloqueos se pueden generar con frecuencia.

    • Las funciones de MapReduce pueden ser difíciles de depurar. Puedes usar print() y printjson() para incluir resultados de diagnóstico en mongod registro.

    • MapReduce generalmente no es intuitivo para los programadores que intentan traducir la experiencia de agregación de consultas relacionales.

  • Ver también:Ejemplos de mapa/reducción .

Marco de agregación

  • Nueva función en la versión de producción de MongoDB 2.2.0 (agosto de 2012).

  • Diseñado con objetivos específicos de mejorar el rendimiento y la usabilidad.

  • Devuelve el conjunto de resultados en línea.

  • Admite colecciones de entrada fragmentadas y no fragmentadas.

  • Utiliza un enfoque de "canalización" en el que los objetos se transforman a medida que pasan por una serie de operadores de canalización, como emparejar, proyectar, ordenar y agrupar.

  • Los operadores de tubería no necesitan producir un documento de salida para cada documento de entrada:los operadores también pueden generar nuevos documentos o filtrar documentos.

  • Con las proyecciones, puede agregar campos calculados, crear nuevos subobjetos virtuales y extraer subcampos al nivel superior de resultados.

  • Los operadores de canalización se pueden repetir según sea necesario (por ejemplo, múltiples $project o $group pasos.

  • Limitaciones actuales

    • Los resultados se devuelven en línea, por lo que están limitados al tamaño máximo de documento admitido por el servidor (16 MB)

    • No admite tantas opciones de salida como MapReduce

    • Limitado a operadores y expresiones compatibles con Aggregation Framework (es decir, no se pueden escribir funciones personalizadas)

    • La función de servidor más reciente para la agregación, por lo que tiene más espacio para madurar en términos de documentación, conjunto de funciones y uso.

  • Consulte también:Ejemplos de marco de agregación .

¿Alguien puede presentar una ilustración o guiarme a un enlace donde se explican estos tres conceptos juntos, tomando los mismos datos de muestra, para que pueda compararlos fácilmente?

Por lo general, no encontrará ejemplos en los que sería útil comparar los tres enfoques, pero aquí hay preguntas anteriores de StackOverflow que muestran variaciones:

  • group() versus marco de agregación
  • MapReduce versus Framework de agregación