Agrupar datos de MongoDB

MongoDBMongoDBBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá a realizar operaciones de agregación básicas en MongoDB, incluyendo agrupar datos por un solo campo, calcular totales de grupo, contar elementos de grupo, filtrar grupos y ordenar los resultados de grupo. Estas habilidades son esenciales para el análisis de datos y la obtención de información de los datos de MongoDB.

El laboratorio cubre una variedad de técnicas de agregación, comenzando con la agrupación de datos por un solo campo y luego expandiéndose a operaciones más complejas, como calcular promedios, conteos y filtrar grupos. Al final del laboratorio, tendrá una sólida comprensión de cómo aprovechar el marco de agregación de MongoDB para desbloquear el poder de sus datos.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/QueryOperationsGroup -.-> mongodb/sort_documents("Sort Documents") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/AggregationOperationsGroup -.-> mongodb/group_documents("Group Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/insert_document -.-> lab-422083{{"Agrupar datos de MongoDB"}} mongodb/query_with_conditions -.-> lab-422083{{"Agrupar datos de MongoDB"}} mongodb/sort_documents -.-> lab-422083{{"Agrupar datos de MongoDB"}} mongodb/project_fields -.-> lab-422083{{"Agrupar datos de MongoDB"}} mongodb/group_documents -.-> lab-422083{{"Agrupar datos de MongoDB"}} mongodb/aggregate_group_totals -.-> lab-422083{{"Agrupar datos de MongoDB"}} end

Agrupar por un solo campo

En este paso, aprenderá a agrupar datos por un solo campo utilizando el marco de agregación de MongoDB. La agrupación le permite organizar y resumir datos basados en un campo específico, lo cual es crucial para el análisis de datos.

Primero, comencemos abriendo la shell de MongoDB:

mongosh

Ahora, creemos una colección de muestra de productos para demostrar la agrupación:

use salesdb

db.products.insertMany([
    { categoría: "Electrónica", precio: 500 },
    { categoría: "Ropa", precio: 50 },
    { categoría: "Electrónica", precio: 300 },
    { categoría: "Libros", precio: 25 },
    { categoría: "Ropa", precio: 75 },
    { categoría: "Libros", precio: 40 }
])

A continuación, usaremos el operador de agregación $group para agrupar los productos por su categoría y calcular el precio total para cada categoría:

db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      totalPrecio: { $sum: "$precio" }
    }
  }
]);
Salida de ejemplo
[
  { _id: 'Electrónica', totalPrecio: 800 },
  { _id: 'Ropa', totalPrecio: 125 },
  { _id: 'Libros', totalPrecio: 65 }
]

Analicemos la canalización de agregación:

  • $group: Agrupa documentos por una expresión especificada
  • _id: "$categoría": Indica que estamos agrupando por el campo categoría
  • totalPrecio: { $sum: "$precio" }: Calcula el precio total para cada categoría

Calcular totales de grupo

En este paso, ampliaremos nuestras habilidades de agrupación anteriores al aprender a calcular varios totales de agregado utilizando el marco de agregación de MongoDB. Utilizaremos múltiples operadores de agregación para obtener información más compleja de nuestros datos de productos.

Continuemos trabajando con la base de datos salesdb y la colección products que creamos en el paso anterior:

// Asegurémonos de estar en la base de datos correcta
use salesdb

Exploraremos diferentes operadores de agregación para calcular los totales de grupo:

  1. Calcular el precio promedio por categoría:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioPromedio: { $avg: "$precio" }
    }
  }
]);
  1. Encontrar los precios máximo y mínimo en cada categoría:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioMax: { $max: "$precio" },
      precioMin: { $min: "$precio" }
    }
  }
]);
  1. Combinar múltiples cálculos en una sola agregación:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioTotal: { $sum: "$precio" },
      precioPromedio: { $avg: "$precio" },
      conteoProductos: { $sum: 1 }
    }
  }
]);
Salida de ejemplo
[
  {
    _id: 'Electrónica',
    precioTotal: 800,
    precioPromedio: 400,
    conteoProductos: 2
  },
  {
    _id: 'Ropa',
    precioTotal: 125,
    precioPromedio: 62.5,
    conteoProductos: 2
  },
  {
    _id: 'Libros',
    precioTotal: 65,
    precioPromedio: 32.5,
    conteoProductos: 2
  }
]

Operadores de agregación principales explicados:

  • $avg: Calcula el promedio de valores numéricos
  • $max: Encuentra el valor máximo
  • $min: Encuentra el valor mínimo
  • $sum: 1: Cuenta el número de documentos en cada grupo

Contar elementos de grupo

En este paso, exploraremos diferentes maneras de contar elementos dentro de grupos utilizando el marco de agregación de MongoDB. Contar es una operación fundamental que te ayuda a entender la distribución de tus datos.

Continuemos trabajando con nuestra base de datos salesdb:

// Asegurémonos de estar en la base de datos correcta
use salesdb

Primero, agreguemos más productos para que nuestro conteo sea más interesante:

db.products.insertMany([
  { categoría: "Electrónica", marca: "Apple" },
  { categoría: "Electrónica", marca: "Samsung" },
  { categoría: "Ropa", marca: "Nike" },
  { categoría: "Ropa", marca: "Adidas" },
  { categoría: "Libros", marca: "Penguin" },
  { categoría: "Libros", marca: "Oxford" }
]);

Ahora, contemos elementos de diferentes maneras:

  1. Contar el número de productos en cada categoría:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      conteoProductos: { $sum: 1 }
    }
  }
]);
  1. Contar marcas únicas dentro de cada categoría:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      marcasUnicas: { $addToSet: "$marca" }
    }
  }
]);
  1. Contar el número de marcas únicas y el total de productos:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      totalProductos: { $sum: 1 },
      marcasUnicas: { $addToSet: "$marca" },
      conteoMarcas: { $addToSet: "$marca" }
    }
  },
  {
    $project: {
      totalProductos: 1,
      conteoMarcasUnicas: { $size: "$marcasUnicas" }
    }
  }
]);
Salida de ejemplo
[
  {
    _id: 'Electrónica',
    totalProductos: 4,
    conteoMarcasUnicas: 2
  },
  {
    _id: 'Ropa',
    totalProductos: 4,
    conteoMarcasUnicas: 2
  },
  {
    _id: 'Libros',
    totalProductos: 4,
    conteoMarcasUnicas: 2
  }
]

Operadores de agregación principales explicados:

  • $sum: 1: Cuenta el número total de documentos en cada grupo
  • $addToSet: Crea una matriz de valores únicos
  • $size: Cuenta el número de elementos en una matriz

Filtrar grupos

En este paso, aprenderemos a filtrar grupos utilizando el marco de agregación de MongoDB. El filtrado te permite centrarte en subconjuntos específicos de tus datos agrupados, lo que proporciona información más dirigida.

Continuemos trabajando con nuestra base de datos salesdb:

// Asegurémonos de estar en la base de datos correcta
use salesdb

Agreguemos información de precios a nuestros productos existentes para que el filtrado tenga más sentido:

db.products.updateMany(
  { categoría: "Electrónica", marca: "Apple" },
  { $set: { precio: 1000 } }
);

db.products.updateMany(
  { categoría: "Electrónica", marca: "Samsung" },
  { $set: { precio: 800 } }
);

db.products.updateMany(
  { categoría: "Ropa", marca: "Nike" },
  { $set: { precio: 100 } }
);

db.products.updateMany(
  { categoría: "Ropa", marca: "Adidas" },
  { $set: { precio: 80 } }
);

Ahora, exploremos diferentes técnicas de filtrado:

  1. Filtrar grupos con más de un producto:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      productos: { $push: "$marca" },
      conteoProductos: { $sum: 1 }
    }
  },
  {
    $match: {
      conteoProductos: { $gt: 1 }
    }
  }
]);
  1. Filtrar grupos con un precio total por encima de un cierto umbral:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioTotal: { $sum: "$precio" },
      productos: { $push: "$marca" }
    }
  },
  {
    $match: {
      precioTotal: { $gt: 500 }
    }
  }
]);
  1. Filtrado complejo con múltiples condiciones:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioTotal: { $sum: "$precio" },
      precioPromedio: { $avg: "$precio" },
      marcas: { $addToSet: "$marca" }
    }
  },
  {
    $match: {
      precioTotal: { $gt: 500 },
      precioPromedio: { $lt: 900 }
    }
  }
]);
Salida de ejemplo
[
  {
    _id: 'Electrónica',
    precioTotal: 1800,
    precioPromedio: 900,
    marcas: [ 'Apple', 'Samsung' ]
  }
]

Operadores de agregación principales explicados:

  • $match: Filtra documentos basados en condiciones especificadas
  • $gt: Mayor que
  • $lt: Menor que
  • $push: Agrega elementos a una matriz
  • $addToSet: Agrega elementos únicos a una matriz

Ordenar los resultados de grupo

En este último paso, aprenderemos a ordenar los resultados agrupados utilizando el marco de agregación de MongoDB. El ordenamiento te ayuda a organizar y priorizar tus datos agregados, lo que facilita su análisis y comprensión.

Continuemos trabajando con nuestra base de datos salesdb:

// Asegurémonos de estar en la base de datos correcta
use salesdb

Utilizaremos los productos que ya hemos creado para demostrar las técnicas de ordenamiento:

  1. Ordenar los grupos por precio total en orden descendente:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioTotal: { $sum: "$precio" },
      conteoProductos: { $sum: 1 }
    }
  },
  {
    $sort: {
      precioTotal: -1
    }
  }
]);
  1. Ordenar los grupos por conteo de productos y precio total:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioTotal: { $sum: "$precio" },
      conteoProductos: { $sum: 1 }
    }
  },
  {
    $sort: {
      conteoProductos: -1,
      precioTotal: 1
    }
  }
]);
  1. Ordenamiento avanzado con múltiples etapas de agregación:
db.products.aggregate([
  {
    $group: {
      _id: "$categoría",
      precioTotal: { $sum: "$precio" },
      precioPromedio: { $avg: "$precio" },
      marcas: { $addToSet: "$marca" }
    }
  },
  {
    $project: {
      categoría: "$_id",
      precioTotal: 1,
      precioPromedio: 1,
      conteoMarcas: { $size: "$marcas" }
    }
  },
  {
    $sort: {
      conteoMarcas: -1,
      precioTotal: -1
    }
  }
]);
Salida de ejemplo
[
  {
    categoría: 'Electrónica',
    precioTotal: 1800,
    precioPromedio: 900,
    conteoMarcas: 2
  },
  {
    categoría: 'Ropa',
    precioTotal: 180,
    precioPromedio: 90,
    conteoMarcas: 2
  },
  {
    categoría: 'Libros',
    precioTotal: 0,
    precioPromedio: 0,
    conteoMarcas: 2
  }
]

Operadores de agregación principales explicados:

  • $sort: Ordena los documentos
    • 1: Orden ascendente
    • -1: Orden descendente
  • $project: Reformatea los documentos, lo que te permite incluir, excluir o transformar campos
  • $size: Cuenta el número de elementos en una matriz

Resumen

En este laboratorio, aprenderás a agrupar datos de MongoDB utilizando el marco de agregación. Primero, agruparás los datos por un solo campo, como la categoría del producto, y calcularás el precio total para cada grupo. Luego, explorarás operadores de agregación más avanzados para calcular los totales de grupo, incluyendo el precio promedio, el recuento de elementos y el filtrado y el ordenamiento de los resultados agrupados. Estas técnicas son esenciales para el análisis de datos y la obtención de información de tus datos de MongoDB.