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

Estoy algo confundido acerca de cuándo usar group (), aggregate con $ group o mapreduce. Leí la documentación en http://www.mongodb.org/display/DOCS/Aggregation para group (), http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group .. ¿Sharding es la única situación en la que group () no funcionará? Además, tengo la sensación de que $ group es más poderoso que group () porque se puede usar junto con otros operadores de canalización desde el marco de agregación. ¿Cómo se compara $ group con mapreduce? Leí en alguna parte que no genera ninguna colección temporal, mientras que mapreduce sí. ¿Es eso así?
¿Puede alguien presentar una ilustración o guiarme a un enlace donde estos tres conceptos se explican juntos, tomando los mismos datos de muestra, para que pueda compararlos fácilmente?

EDITAR:
Además, sería genial si puedes señalar algo nuevo específicamente en estos comandos desde que salió la nueva versión 2.2.

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

El comando group (), Aggregation Framework y MapReduce son funciones de agregación colectiva de MongoDB. Hay algunas superposiciones en las características, pero intentaré explicar las diferencias y limitaciones de cada una de ellas en MongoDB 2.2.0.

Nota: los conjuntos de resultados en línea mencionados a continuación se refieren a las consultas que se procesan en la memoria con los 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 resultados en una colección nueva o existente.

Comando group()

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

  • El resultado de devolución se establece en línea (como una matriz de elementos agrupados).

  • Implementado usando el motor de JavaScript; las funciones custom reduce() 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 locking 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 de grupo () .

mapreduce

  • 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 datos no fragmentadas y fragmentadas.

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

  • MongoDB 2.2 implementa un soporte mucho mejor para la producción de mapas reducidos .

  • Limitaciones actuales

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

    • Hay un locking de JavaScript para que un servidor de mongod solo pueda ejecutar una función de JavaScript en un punto en el tiempo … sin embargo, la mayoría de los pasos de MapReduce son muy cortos para que los lockings se puedan producir con frecuencia.

    • Las funciones de MapReduce pueden ser difíciles de depurar. Puede usar print() e printjson() para incluir la salida de diagnóstico en el registro de mongod .

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

  • Ver también: Mapa / Reducir ejemplos .

Marco de Agregación

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

  • Diseñado con objectives específicos para mejorar el rendimiento y la usabilidad.

  • El resultado de devolución se establece en línea.

  • Admite colecciones de datos no fragmentadas y 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 la coincidencia, la proyección, la clasificación y la agrupación.

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

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

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

  • Limitaciones actuales

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

    • No admite tantas opciones de salida como MapReduce

    • Limitado a operadores y expresiones compatibles con el Framework de agregación (es decir, no puede escribir funciones personalizadas)

    • La característica de servidor más nueva para la agregación, por lo que tiene más espacio para madurar en términos de documentación, conjunto de características y uso.

  • Ver también: ejemplos del Marco Agregado .

¿Puede alguien presentar una ilustración o guiarme a un enlace donde estos tres conceptos se explican 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í están las preguntas previas de StackOverflow que muestran variaciones:

  • grupo () versus Marco de Agregación
  • MapReduce frente al marco de agregación