Uniones en MongoDB con el Operador Lookup para Análisis de Datos

Clase 14 de 21Curso 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:

  1. Clientes: Guarda información sobre los clientes, como su nombre y correo.
  2. Cuentas: Almacena los datos de las cuentas adquiridas por los clientes.
  3. 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.