Contenido del curso
Operaciones básicas
Etapas de Aggregation Framework
Operaciones avanzadas
Performance y optimización
Próximos pasos
Relaciones entre colecciones con $lookup
Resumen
MongoDB suele cargar con la fama de no permitir uniones entre colecciones, pero el operador $lookup desmiente ese mito y te permite relacionar datos entre colecciones igual que harías un JOIN en SQL. Aquí aprenderás a combinar varias colecciones en un solo pipeline de aggregation y a resolver un caso real: encontrar los clientes con más transacciones en una tienda.
Qué es el operador $lookup en MongoDB y para qué sirve
El operador $lookup vincula documentos de dos colecciones distintas dentro de un aggregation pipeline. Es la respuesta de MongoDB a las relaciones nativas de bases de datos relacionales, y te abre la puerta a consultas que combinan información dispersa.
¿Qué hace $lookup en MongoDB? Une dos colecciones a partir de un campo común y devuelve los resultados como un array dentro del documento original, similar a un LEFT JOIN en SQL.
En la clase trabajamos con la base de datos Sample Analytics de MongoDB Atlas, que contiene tres colecciones [01:05]:
- customers: nombre, correo y datos del cliente.
- accounts: cuentas asociadas a cada cliente.
- transactions: histórico de movimientos por cuenta.
El objetivo es claro: obtener los cinco clientes con mayor cantidad de transacciones y mostrar su nombre junto al total de compras.
Cómo hacer un $lookup paso a paso entre colecciones
Para que $lookup funcione necesitas cuatro parámetros que replican la lógica de un JOIN relacional [02:15].
Cuáles son los parámetros obligatorios de $lookup
- from: la colección con la que vas a unir. En el primer cruce usamos accounts.
- localField: el campo de la colección actual que servirá de enlace. Aquí también se llama accounts.
- foreignField: el campo equivalente en la colección destino, en este caso account_id.
- as: el nombre del array donde se guardará el resultado de la unión, por ejemplo accountInfo.
El resultado del primer $lookup llega como un array embebido en el documento. Y aquí viene un detalle importante: para operar sobre ese contenido necesitas abrirlo.
Por qué usar $unwind después de $lookup
El operador $unwind desenrolla el array y deja cada documento listo para la siguiente etapa [04:20]. Sin este paso, no podrías hacer un segundo cruce limpio con la colección de transacciones.
La secuencia queda así:
- Primer $lookup entre customers y accounts.
- $unwind sobre accountInfo.
- Segundo $lookup entre accountInfo y transactions, usando account_id como campo común.
- $unwind sobre accountTransactions para dejar disponibles los documentos individuales.
Con esos cuatro pasos las tres colecciones quedan unificadas en un solo flujo de datos.
Cómo agrupar y ordenar para obtener el top 5 de clientes
Unir colecciones es solo la mitad del trabajo. Para encontrar a los clientes con más transacciones necesitas agrupar, ordenar y limitar [06:30].
Qué operadores cierran el pipeline
- $group: agrupa por el nombre del cliente y acumula el total de transacciones con $sum.
- $sort: ordena de mayor a menor según el total de compras.
- $limit: corta el resultado en los primeros cinco registros.
- $project: define qué campos mostrar al final, en este caso id, name y totalPurchases.
¿Cómo cuento transacciones por cliente en MongoDB? Usa $group con _id en el nombre y un acumulador $sum sobre el campo de transacciones desenrollado. Luego aplica $sort descendente y $limit 5.
El resultado final muestra que Rodríguez es el cliente más activo de la tienda con más de 600 transacciones, seguido por el resto del top cinco [08:45]. Lo interesante es que toda la consulta se resuelve dentro de un único pipeline, sin necesidad de múltiples llamadas ni procesamiento externo.
Qué aprendiste sobre relaciones en MongoDB
Las uniones en MongoDB no solo existen, sino que son flexibles y se integran con el resto de operadores del aggregation framework. La combinación de $lookup, $unwind, $group, $sort, $limit y $project te da el mismo poder analítico que esperarías de SQL, pero con la flexibilidad del modelo documental.
Un detalle práctico: cuida la escritura exacta de los campos. En la clase, un error de tipeo en foreignField bloqueó la consulta hasta corregirlo [03:10]. MongoDB no perdona errores ortográficos en los operadores.
¿Cómo resolverías tú este reto? Comparte tu pipeline en los comentarios y compáralo con el de tus compañeros.