En este tema, aprenderemos sobre el uso de pipelines en MongoDB, una característica poderosa del marco de agregación que permite procesar y transformar datos de manera eficiente. Los pipelines son secuencias de etapas que procesan documentos de una colección, permitiendo realizar operaciones complejas en los datos.

Conceptos Clave

  1. Pipeline: Una secuencia de etapas que procesan documentos.
  2. Etapa: Cada paso en el pipeline que realiza una operación específica.
  3. Operadores de Agregación: Funciones que se utilizan dentro de las etapas para transformar los datos.

Estructura de un Pipeline

Un pipeline en MongoDB se define como una lista de etapas, donde cada etapa es un documento que especifica una operación. La estructura básica es la siguiente:

[
  { <etapa1>: { <especificación1> } },
  { <etapa2>: { <especificación2> } },
  ...
]

Ejemplo Práctico

Supongamos que tenemos una colección orders con documentos que representan pedidos de una tienda en línea. Cada documento tiene la siguiente estructura:

{
  "_id": ObjectId("..."),
  "customerId": "12345",
  "items": [
    { "productId": "A1", "quantity": 2, "price": 10 },
    { "productId": "B2", "quantity": 1, "price": 20 }
  ],
  "total": 40,
  "date": ISODate("2023-10-01T00:00:00Z")
}

Queremos calcular el total de ventas por cada cliente. Para ello, utilizaremos un pipeline con las siguientes etapas:

  1. Descomponer los elementos del pedido: Usamos $unwind para descomponer el array items.
  2. Agrupar por cliente: Usamos $group para agrupar los documentos por customerId y sumar los totales.
  3. Proyectar el resultado: Usamos $project para formatear el resultado final.

Código del Pipeline

db.orders.aggregate([
  { $unwind: "$items" },
  {
    $group: {
      _id: "$customerId",
      totalSales: { $sum: { $multiply: ["$items.quantity", "$items.price"] } }
    }
  },
  {
    $project: {
      _id: 0,
      customerId: "$_id",
      totalSales: 1
    }
  }
])

Explicación del Código

  1. $unwind: Descompone el array items en documentos individuales.

    { $unwind: "$items" }
    

    Esto convierte cada documento con un array items en múltiples documentos, uno por cada elemento del array.

  2. $group: Agrupa los documentos por customerId y calcula el total de ventas.

    {
      $group: {
        _id: "$customerId",
        totalSales: { $sum: { $multiply: ["$items.quantity", "$items.price"] } }
      }
    }
    

    Aquí, _id es el campo por el cual agrupamos (en este caso, customerId). totalSales es el campo calculado que suma el producto de quantity y price para cada item.

  3. $project: Formatea el resultado final.

    {
      $project: {
        _id: 0,
        customerId: "$_id",
        totalSales: 1
      }
    }
    

    Esto proyecta los campos deseados en el resultado final, eliminando el campo _id y renombrando customerId.

Ejercicio Práctico

Ejercicio

Dada una colección employees con la siguiente estructura:

{
  "_id": ObjectId("..."),
  "name": "John Doe",
  "department": "Sales",
  "salary": 50000,
  "joinDate": ISODate("2020-01-15T00:00:00Z")
}

Crea un pipeline que calcule el salario promedio por departamento.

Solución

db.employees.aggregate([
  {
    $group: {
      _id: "$department",
      averageSalary: { $avg: "$salary" }
    }
  },
  {
    $project: {
      _id: 0,
      department: "$_id",
      averageSalary: 1
    }
  }
])

Explicación de la Solución

  1. $group: Agrupa los documentos por department y calcula el salario promedio.

    {
      $group: {
        _id: "$department",
        averageSalary: { $avg: "$salary" }
      }
    }
    

    Aquí, _id es el campo por el cual agrupamos (en este caso, department). averageSalary es el campo calculado que obtiene el promedio de salary.

  2. $project: Formatea el resultado final.

    {
      $project: {
        _id: 0,
        department: "$_id",
        averageSalary: 1
      }
    }
    

    Esto proyecta los campos deseados en el resultado final, eliminando el campo _id y renombrando department.

Conclusión

En esta sección, hemos aprendido cómo usar pipelines en MongoDB para procesar y transformar datos de manera eficiente. Hemos visto cómo descomponer arrays, agrupar documentos y proyectar resultados. Los pipelines son una herramienta poderosa que permite realizar operaciones complejas en los datos de manera eficiente y flexible. En el siguiente módulo, exploraremos características avanzadas de MongoDB, como la replicación y la fragmentación.

© Copyright 2024. Todos los derechos reservados