Contenido del curso
Operaciones básicas
Etapas de Aggregation Framework
Operaciones avanzadas
Performance y optimización
Próximos pasos
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:
$outdebe ser siempre la última etapa del pipeline, después de$projecty 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
$outcuando quieras reemplazar completamente la colección destino con el resultado del pipeline;$mergees 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.