Cómo guardar resultados de pipelines con $out

Resumen

El operador $out en MongoDB te permite guardar el resultado de un pipeline de agregación en una colección nueva, lo que resulta útil para reportes, exportaciones y caché de consultas complejas. Si trabajas con MongoDB Aggregation Framework y necesitas que otros equipos accedan a datos procesados sin reejecutar tu consulta, este operador es una pieza clave.

¿Qué hace el operador $out en un pipeline de agregación?

Cuando ejecutas un pipeline, los resultados existen únicamente en memoria y no persisten. Aquí entra $out: toma toda la salida de tus etapas previas y la materializa en una colección dentro de tu base de datos.

¿Qué es el operador $out en MongoDB? Es un operador que se coloca como última etapa de un pipeline de agregación y guarda los resultados en una colección nueva o existente dentro de la misma base de datos.

Esto te sirve para tres escenarios concretos:

  • Generar un caché accesible cuando otro departamento necesita los datos.
  • Exportar resultados sin reejecutar consultas complejas.
  • Preparar reportes recurrentes con un formato ya definido.

¿Cómo construir un pipeline con $out paso a paso?

Usando la colección de Airbnb en MongoDB Compass, el ejercicio consiste en encontrar las propiedades más costosas agrupadas por barrio y persistir ese resultado [02:00].

Etapa 1: ordenar con $sort

La primera etapa ordena los documentos por mercado y precio descendente. Cada etapa del pipeline debe ir dentro de un objeto, algo que MongoDB Compass te recuerda apenas omites las llaves.

javascript { $sort: { "address.market": 1, price: -1 } }

Etapa 2: agrupar con $group

El $group necesita siempre el campo _id para indicar por cuál valor se agrupa. En este caso, agrupas por barrio y usas el acumulador $first para quedarte con la propiedad más costosa de cada zona [03:30].

javascript { $group: { _id: "$address.market", masCostosa: { $first: "$name" }, precio: { $first: "$price" } } }

Recuerda que $first y $last dependen del orden previo, por eso el $sort va antes.

Etapa 3: persistir con $out

La última etapa recibe el nombre de la colección destino. MongoDB Compass muestra una barra informativa avisando que esta operación persiste datos y no se ejecuta en tiempo real hasta que presionas el botón run [05:15].

javascript { $out: "propiedades_mas_costosas" }

Al ejecutarlo, aparece una colección nueva con exactamente la salida del pipeline, lista para exportarse o consumirse desde otro equipo.

¿Qué precauciones debes tener al usar $out?

Antes de incorporarlo a producción, conviene revisar varios detalles que pueden generar problemas si los pasas por alto.

  • Posición obligatoria: $out debe ser siempre la última etapa del pipeline, después de $project y cualquier otro operador.
  • Sobrescritura silenciosa: si la colección destino ya existe, MongoDB la sobrescribe sin pedir confirmación.
  • Impacto en rendimiento: crear una colección nueva cada vez que ejecutas el pipeline consume recursos y puede afectar costos.
  • Índices no se transfieren: si tu colección original tenía índices configurados, la colección resultante nace sin ninguno.
  • Errores se propagan: si nombraste mal un campo o cometiste un error en una etapa previa, ese error queda persistido tal cual.

¿$out sobrescribe colecciones existentes? Sí, si el nombre que asignas coincide con una colección ya creada, MongoDB la reemplaza por completo sin preguntar.

¿Para qué sirve $out en un caso real?

Imagina que un diseñador de otro departamento necesita armar un reporte tipo tarjeta similar a la página de Airbnb: foto, nombre de la propiedad y calificaciones. Esa persona no quiere tocar MongoDB Aggregation Framework, solo consumir una colección ya preparada [07:30].

Aquí es donde combinas $project para seleccionar únicamente los campos que necesita el diseñador y cierras con $out para entregarle una colección lista. El diseñador consulta directamente esa colección y tú no tienes que reejecutar nada cada vez que pide datos.

¿Cuándo conviene usar $out en lugar de $merge? Usa $out cuando quieras reemplazar completamente la colección destino con el resultado del pipeline; $merge es preferible cuando necesitas actualizar o insertar registros sin perder los existentes.

¿Cómo estructurarías tú ese $project para entregar el reporte de tarjetas al diseñador? Comparte tu propuesta en los comentarios.