Introducción
Conoce el potencial de Aggregation Framework usando datos reales
Casos para usar Aggregation Framework y no queries de MongoDB o map-reduce
Preparando entorno de trabajo: configurando MongoDB Atlas y la base de datos
Preparando entorno de trabajo: Docker y Mongo Compass
Operaciones básicas
Filtrando documentos con $match
Tranformando los datos con $group
Moldeamos los resultados con $project
Agregamos etapas con $count y $avg
Manipulando campos con $set
Etapas de Aggregation Framework
Trabajando con arrays y $unwind
Persistencia de datos con $out
Trabajamos y conocemos $geoNear
Consultas geoespaciales con $geoNear
Aprendemos a usar $lookup
Operaciones avanzadas
Funciones personalizadas
Evaluando expresiones con $redact
Usando funciones personalizadas con $accumulator
Agrupaciones avanzadas con $bucket y $bucketAuto
Performance y optimización
Recomendaciones para optimización y uso de recursos
Realizando profiling en MongoDB
Próximos pasos
Repaso de lo aprendido y recomendaciones
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
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.
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:
Nos enfocaremos en obtener los clientes con el mayor número de transacciones, mostrando su nombre y la cantidad total de transacciones que realizaron.
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:
lockup
para la primera uniónEl 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
.
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"
}
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"
}
}
De nuevo aplicamos $unwind
para acceder a los detalles de las transacciones:
{
$unwind: "$account_transactions"
}
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.
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 }
}
}
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
}
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.
Aportes 6
Preguntas 1
//realizar uniones con otras colecciones
// listar los clientes que tienen la mayor cantidad de transacciones
[
{
$lookup: {
from: "accounts", // coleccion de donde se parte
localField: "accounts", //campo de la coleccion customers
foreignField: "account_id", // cacmpo a relacionar de la coleccion customers a la coleccion account
as: "account_info" //array donde se alamacena la informacion
}
},
// para trabajar el array resultado del primer resultado
{
$unwind: "$account_info"
},
{
$lookup: {
from: "transactions",
localField: "account_info.account_id",
foreignField: "account_id",
as: "account_transactions"
}
},
{
$unwind: "$account_transactions"
},
{
$group:{
_id: "$name",
totalCompras:{
$sum:{
$size: "$account_transactions.transactions"
}
}
}
},
{
$sort:{
totalCompras: -1
}
},
{
$limit:5
},
{
$project:{
_id:0,
Nombre: "$_id",
totalCompras: 1
}
}
]
use('sample_analytics')
db.customers.aggregate([
{
$lookup: {
from: "accounts",
localField: "accounts",
foreignField: "account_id",
as: "account_info"
}
},
{
$unwind: "$account_info"
},
{
$lookup: {
from: "transactions",
localField: "account_info.account_id",
foreignField: "account_id",
as: "account_trasactions"
}
},
{
$unwind: "$account_trasactions"
},
{
$group: {
_id: "$name",
total: {
$sum: {
$size: "$account_trasactions.transactions"
}
}
}
},
{
$sort: {
total: -1
}
},
{
$limit: 5
}
])
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?