Uniones en MongoDB con el Operador Lookup para Análisis de Datos
Clase 14 de 21 • Curso de MongoDB: Aggregation Framework
Resumen
¿Cómo manejar relaciones en MongoDB usando lockup?
MongoDB es frecuentemente catalogado como limitado en cuanto a la gestión de uniones, porque no maneja las relaciones entre tablas de manera nativa, como lo hacen las bases de datos relacionales. Sin embargo, el operador lockup
viene al rescate. Este operador permite unir colecciones en MongoDB, haciendo posible el manejo de datos interrelacionados con la misma facilidad que en bases de datos relacionales. Te explicaré cómo puedes lograrlo y cómo puedes usar estas uniones para obtener análisis profundos de tus datos, específicamente generando una lista de clientes con más transacciones.
¿Qué base de datos utilizamos y cuál es su estructura?
En esta explicación, consideraremos una base de datos distinta a la usada anteriormente. Usaremos una base de datos que contiene información sobre compras y transacciones de una tienda. La estructura está dividida en tres colecciones:
- Clientes: Guarda información sobre los clientes, como su nombre y correo.
- Cuentas: Almacena los datos de las cuentas adquiridas por los clientes.
- Transacciones: Contiene el historial de transacciones realizadas en la tienda.
Nos enfocaremos en obtener los clientes con el mayor número de transacciones, mostrando su nombre y la cantidad total de transacciones que realizaron.
¿Cómo se aplican las uniones en MongoDB?
La unión de colecciones en MongoDB se lleva a cabo en la pestaña de 'aggregations' a través de una serie de pasos organizados en un pipeline. A continuación, desglosamos cómo se realiza:
Primer paso: Usando lockup
para la primera unión
El primer paso es realizar una unión utilizando lockup
entre la colección de cuentas y la de clientes. Este es el código en MongoDB:
db.accounts.aggregate([
{
$lookup: {
from: "clients",
localField: "accountID",
foreignField: "accountID",
as: "account_info"
}
}
])
Asegúrate de tener un campo común entre ambas colecciones para hacer la relación, en este caso, accountID
.
Segundo paso: Desenrollar arrays
Después de una unión con lockup
, los resultados se devuelven en un array. Necesitamos desenrollar este array para acceder a los documentos individuales mediante el operador $unwind
:
{
$unwind: "$account_info"
}
Tercer paso: Segunda unión con lockup
Repetimos el proceso para unir las transacciones con la información de cuentas. Aquí especificamos nuevamente los campos necesarios y cómo queremos que se nombre esta segunda unión:
{
$lookup: {
from: "transactions",
localField: "account_info.accountID",
foreignField: "accountID",
as: "account_transactions"
}
}
Cuarto paso: Desenrollar el segundo array
De nuevo aplicamos $unwind
para acceder a los detalles de las transacciones:
{
$unwind: "$account_transactions"
}
¿Cómo se obtiene el top de clientes con más transacciones?
Tras unir las colecciones necesarias, utilizamos el operador $group
para agrupar los datos por cliente, obtener la cuenta total de transacciones, y finalmente ordenarlos para poder identificar los clientes más activos.
Agrupación de clientes por número de transacciones
El operador $group
ayuda a reunir datos basados en un criterio en común. En este caso, agrupamos por el nombre del cliente y acumulamos la información sobre sus transacciones:
{
$group: {
_id: "$account_info.clientName",
total_transactions: { $sum: 1 }
}
}
Orden y límite de resultados
Luego, ordenamos a los clientes en base al número total de transacciones en orden descendente para identificar aquellos más activos, y limitamos el resultado para obtener sólo los mejores cinco clientes:
{
$sort: { total_transactions: -1 }
},
{
$limit: 5
}
Proyección final de resultados
Finalmente, usamos $project
para formatear cómo queremos que se presenten los resultados, enfocándonos en el nombre del cliente y el total de transacciones:
{
$project: {
_id: 0,
clientName: "$_id",
total_transactions: 1
}
}
¡Y eso es todo! Ahora tienes una lista ordenada con los cinco clientes que más han transaccionado en tu tienda. Esta metodología, aunque robusta, evidencia la flexibilidad y el poder de MongoDB cuando se requieren uniones complejas y análisis avanzado de datos.