Introducción
En este laboratorio, aprenderá a realizar operaciones básicas de agregación en MongoDB. Estas operaciones le permiten procesar registros de datos y devolver resultados calculados. Aprenderá a calcular totales, encontrar valores mínimos y máximos, contar documentos y calcular promedios. El laboratorio utiliza una colección de muestra bookstore para demostrar el poder del framework de agregación de MongoDB para extraer información significativa de sus datos.
Conectar y Poblar Datos
Antes de poder resumir datos, necesitamos conectarnos al servidor de MongoDB e insertar algunos datos de ejemplo. En este paso, iniciará la Shell de MongoDB (MongoDB Shell), creará una base de datos y poblará una colección con información de libros.
Primero, abra su terminal e inicie la Shell de MongoDB (mongosh):
mongosh
Ahora se encuentra dentro de la Shell de MongoDB, que le permite interactuar con sus bases de datos. Cambiemos a una nueva base de datos llamada bookstore. Si la base de datos no existe, MongoDB la creará por usted cuando almacene datos por primera vez.
use bookstore
A continuación, insertaremos múltiples documentos de libros en una colección llamada books utilizando el método insertMany(). Cada documento es un objeto JSON que contiene un title (título), price (precio) y quantity (cantidad).
db.books.insertMany([
{ title: "Python Basics", price: 29.99, quantity: 50 },
{ title: "MongoDB Essentials", price: 39.99, quantity: 30 },
{ title: "Data Science Guide", price: 45.5, quantity: 25 },
{ title: "Web Development", price: 34.75, quantity: 40 }
]);
Debería ver una salida que confirma que los documentos se insertaron correctamente.
Para verificar que los datos se han agregado, puede usar el método find() para recuperar y mostrar todos los documentos en la colección books.
db.books.find();
La salida listará los cuatro documentos que acaba de insertar, cada uno con un _id único asignado por MongoDB.
[
{
_id: ObjectId("..."),
title: 'Python Basics',
price: 29.99,
quantity: 50
},
{
_id: ObjectId("..."),
title: 'MongoDB Essentials',
price: 39.99,
quantity: 30
},
{
_id: ObjectId("..."),
title: 'Data Science Guide',
price: 45.5,
quantity: 25
},
{
_id: ObjectId("..."),
title: 'Web Development',
price: 34.75,
quantity: 40
}
]
Ahora que nuestra colección está configurada, podemos proceder a realizar operaciones de agregación.
Calcular Totales
En este paso, aprenderá a calcular valores totales utilizando el framework de agregación de MongoDB. Las pipelines de agregación procesan datos a través de una serie de etapas. Utilizaremos la etapa $group para agrupar documentos y el operador $sum para realizar cálculos.
Comencemos calculando la cantidad total de libros en stock en todos los títulos. Agruparemos todos los documentos en un solo grupo y sumaremos sus campos quantity.
db.books.aggregate([
{
$group: {
_id: null,
totalQuantity: { $sum: "$quantity" }
}
}
]);
Aquí hay un desglose del comando:
db.books.aggregate([...]): Inicia una pipeline de agregación en la colecciónbooks.$group: La etapa que agrupa los documentos de entrada._id: null: Especifica que todos los documentos de la colección deben agruparse en un único documento de salida.totalQuantity: { $sum: "$quantity" }: Define un nuevo campototalQuantity. El operador$sumcalcula la suma del campoquantity(precedido por$) para todos los documentos del grupo.
La salida esperada es:
[{ "_id": null, "totalQuantity": 145 }]
A continuación, calculemos el valor total del inventario de todos los libros combinados. Esto requiere multiplicar el price por la quantity de cada libro y luego sumar los resultados.
db.books.aggregate([
{
$group: {
_id: null,
totalBookValue: { $sum: { $multiply: ["$price", "$quantity"] } }
}
}
]);
En esta pipeline:
$multiply: ["$price", "$quantity"]: Esta expresión multiplica los campospriceyquantitypara cada documento.$sum: Este operador suma los resultados de la multiplicación para todos los documentos.
La salida esperada es:
[{ "_id": null, "totalBookValue": 5226.7 }]
Encontrar Valores Mínimo y Máximo
Encontrar los valores mínimos y máximos en un conjunto de datos es una tarea de análisis común. En este paso, utilizará los operadores de agregación $min y $max para encontrar los libros más baratos y más caros en nuestra colección.
Al igual que $sum, los operadores $min y $max se utilizan dentro de la etapa $group. Creemos una única pipeline de agregación para encontrar tanto los precios de libros más bajos como los más altos.
db.books.aggregate([
{
$group: {
_id: null,
lowestPrice: { $min: "$price" },
highestPrice: { $max: "$price" }
}
}
]);
Esta pipeline funciona de la siguiente manera:
_id: null: Agrupa todos los documentos juntos.lowestPrice: { $min: "$price" }: Crea un campolowestPricey establece su valor al valor mínimo del campopriceen todos los documentos.highestPrice: { $max: "$price" }: Crea un campohighestPricey establece su valor al valor máximo del campoprice.
La salida esperada mostrará los precios mínimos y máximos encontrados en la colección:
[{ "_id": null, "lowestPrice": 29.99, "highestPrice": 45.5 }]
Puede aplicar la misma lógica a otros campos numéricos. Por ejemplo, para encontrar las cantidades mínimas y máximas en stock, utilizaría $min y $max en el campo quantity.
db.books.aggregate([
{
$group: {
_id: null,
lowestQuantity: { $min: "$quantity" },
highestQuantity: { $max: "$quantity" }
}
}
]);
La salida esperada para esta consulta es:
[{ "_id": null, "lowestQuantity": 25, "highestQuantity": 50 }]
Contar Documentos y Calcular Promedios
En este paso, aprenderá dos técnicas de resumen más útiles: contar documentos y calcular promedios. Exploraremos tanto un método de conteo simple como el framework de agregación para escenarios más complejos.
Primero, contemos el número total de documentos en nuestra colección books. El método countDocuments() es la forma más sencilla de hacerlo.
db.books.countDocuments();
La salida será un solo número:
4
También puede proporcionar un filtro de consulta a countDocuments() para contar solo los documentos que cumplen criterios específicos. Por ejemplo, contemos cuántos libros tienen un precio superior a $35.
db.books.countDocuments({ price: { $gt: 35 } });
El operador $gt significa "greater than" (mayor que). La salida será:
2
A continuación, calculemos el precio promedio de los libros utilizando el framework de agregación. El operador $avg, utilizado dentro de una etapa $group, calcula el promedio de un campo numérico.
db.books.aggregate([
{
$group: {
_id: null,
averagePrice: { $avg: "$price" }
}
}
]);
Esta pipeline agrupa todos los documentos y calcula el promedio del campo price. La salida será:
[{ "_id": null, "averagePrice": 37.56 }]
El framework de agregación proporciona una forma potente y flexible de realizar cálculos como contar y promediar, especialmente cuando se combina con otras etapas para manejar una lógica más compleja.
Generar un Informe Resumen
En este paso final, combinará varias etapas de agregación para generar un informe de resumen más complejo. Esto demuestra cómo puede encadenar operadores para crear vistas perspicaces de sus datos. Crearemos un informe que categoriza los libros en niveles de precio "Budget" (Económico) y "Premium" (Premium) y calcula estadísticas de resumen para cada uno.
Nuestro objetivo es agrupar los libros según su precio, luego calcular el número de títulos, la cantidad total, el valor total y el precio promedio para cada grupo.
Ejecute la siguiente pipeline de agregación:
db.books.aggregate([
{
$group: {
_id: {
$cond: {
if: { $lt: ["$price", 35] },
then: "Budget",
else: "Premium"
}
},
totalBooks: { $sum: 1 },
totalQuantity: { $sum: "$quantity" },
totalValue: { $sum: { $multiply: ["$price", "$quantity"] } },
avgPrice: { $avg: "$price" }
}
}
]);
Analicemos esta potente pipeline:
$group: Esta etapa es el núcleo de nuestro informe._id: { $cond: ... }: En lugar denull, utilizamos el operador$cond(condicional) para determinar dinámicamente el ID del grupo. Si elpricede un libro es menor que ($lt) 35, se asigna al grupo "Budget"; de lo contrario, es "Premium".totalBooks: { $sum: 1 }: Esta es una técnica común para contar documentos dentro de un grupo. Por cada documento, suma1al total.totalQuantity,totalValue,avgPrice: Estos son los mismos acumuladores que aprendió en pasos anteriores, pero ahora operan dentro de cada categoría de precio.
La salida proporciona un resumen limpio para cada categoría. Tenga en cuenta que el orden de los documentos puede variar.
[
{
"_id": "Premium",
"totalBooks": 2,
"totalQuantity": 55,
"totalValue": 2212.75,
"avgPrice": 42.745
},
{
"_id": "Budget",
"totalBooks": 2,
"totalQuantity": 90,
"totalValue": 2984.5,
"avgPrice": 32.37
}
]
Este ejemplo muestra cómo el framework de agregación se puede utilizar para transformar datos brutos en informes estructurados y significativos directamente dentro de la base de datos.
Resumen
En este laboratorio, ha aprendido los fundamentos de la agregación de datos en MongoDB. Comenzó conectándose a una base de datos y poblando una colección con datos de ejemplo. Luego utilizó el framework de agregación para realizar varias tareas de resumen comunes. Ha aprendido a usar la etapa $group con operadores como $sum para calcular totales, $min y $max para encontrar valores límite, y $avg para calcular promedios. También practicó el uso de countDocuments() para recuentos simples y vio cómo construir un informe de resumen multifacético combinando múltiples operadores y etapas. Estas habilidades son esenciales para analizar datos y obtener información valiosa de sus colecciones de MongoDB.

