Agregaciones y tuberías en MongoDB (Aggregation Operations)

diego.coder26
4 min readJul 9, 2022

Artículo básico de MongoDB. Operaciones cotidianas de procesamiento y cálculos de documentos.

Recomendaciones

Antes de empezar a estudiar agregaciones y tuberías en MongoDB, se recomienda contar con algunos conocimientos previos antes de leer este artículo, por lo cual, dejo la invitación a revisar los siguientes enlaces de apoyo opcionales:

Operaciones de agregaciones

Las operaciones de agregación en MongoDB son herramientas dentro de MQL (MongoDB Query Language) que nos permiten procesar documentos de manera avanzada y obtener resultados calculados. Estas operaciones nos ayudan a realizar agrupaciones, sumas, promedios y otras operaciones matemáticas de nuestros datos.

Las operaciones de agregación se utilizan mayoritariamente para:

  • Agrupar valores de varios documentos.
  • Procesamiento y manipulación de información.
  • Analizar cambios de datos a lo largo del tiempo.

A su vez, las operaciones de agregación en MongoDB se realizan principalmente de las siguientes formas:

  • Mediante tuberías y transformaciones.
  • Mediante métodos de agregación de propósio único.

Estas formas permiten realizar análisis con secuencias de etapas de procesamiento o simplemente contar documentos. Podemos elegir cualquiera de estas opciones según nuestras necesidades.

Tuberías y transformaciones

Para realizar el procesamiento de documentos, MongoDB se basa en el “Patrón de filtro de tubería”, utilizado comúnmente en arquitecturas de software y sistemas operativos Unix. Este patrón se compone de una serie de etapas, donde cada una ejecuta una operación específica con los datos de entrada. Después de cada etapa, el resultado se pasa a la siguiente etapa para su procesamiento. Es decir, cada etapa toma los resultados de la anterior y los utiliza como entrada para realizar su propia operación.

Para aplicar este patrón, MongoDB nos entrega el método aggregate() . Este método recibe un array de operaciones (más conocidas como tuberías o pipes en inglés) las cuales se ejecutarán en secuencia una por una hasta llegar al resultado esperado.

Ejemplo de funcionamiento:

A continuación los operadores más utilizados:

  1. $match: Filtrado de documentos con criterios.
  2. $sort: Orden de documentos.
  3. $project: Selección de campos en específico.
  4. $group: Agrupación de documentos.

A continuación algunos ejemplos básicos con estas funcionalidades.

Sandbox

Antes de empezar a utilizar estos operadores, es necesario preparar un conjunto de datos ficticios para poder realizar nuestras pruebas. Para lograr esto, debemos ejecutar el siguiente código:

// ------------- Creación de colección ------------------
db.createCollection("users");

// ------------- Inserción de documentos ----------------
db.users.insertMany([
{
name: "Diego",
email: "diego@example.com",
age: 27
},
{
name: "Franco",
email: "franco@example.com",
age: 20
},
{
name: "Juan",
email: "juan@example.com",
age: 40
}
]);

1. $match

Para filtrar los documentos que coinciden con las condiciones especificadas se utiliza el operador $match .

// Realizar filtro exacto
db.users.aggregate([
{
$match: {age: 40}
}
]);

// Resultado
[
{
"_id": {"$oid": "62c8dab3651fc8378654b2f4"},
"age": 40,
"email": "juan@example.com",
"name": "Juan"
}
]

2. $sort

Para ordenar todos los documentos de entrada y retornar la canalización, se utiliza el operador $sort . Este puede ordenar de forma ascendente (1) o descendente (-1) según el criterio.

db.users.aggregate([
{
$sort: {age: -1}
}
]);

// Resultado
[
{
"_id": {"$oid": "62c8dab3651fc8378654b2f4"},
"age": 40,
"email": "juan@example.com",
"name": "Juan"
},
{
"_id": {"$oid": "62c8dab3651fc8378654b2f2"},
"age": 27,
"email": "diego@example.com",
"name": "Diego"
},
{
"_id": {"$oid": "62c8dab3651fc8378654b2f3"},
"age": 20,
"email": "franco@example.com",
"name": "Franco"
}
]

3. $project

Para seleccionar campos específicos y descartar otros, se utiliza el operador $project. Mencionando que este operador también puede agregar nuevos campos calculados.

db.users.aggregate([
{
$project: {age: 0, name: 0}
}
]);

// Resultado
[
{
"_id": {"$oid": "62c8dab3651fc8378654b2f2"},
"email": "diego@example.com"
},
{
"_id": {"$oid": "62c8dab3651fc8378654b2f3"},
"email": "franco@example.com"
},
{
"_id": {"$oid": "62c8dab3651fc8378654b2f4"},
"email": "juan@example.com"
}
]

4. $group

Para separar los documentos en grupos según una “clave de grupo”. Se utiliza el operador $groupy el resultado es un documento para cada clave de grupo única, similar a group by en SQL.

db.users.aggregate([{
$group: {
_id: null,
avgAge: { $avg: "$age" }
}
}]);

// Resultado
[
{
"_id": null,
"avgAge": 29
}
]

Métodos de agregación de propósito único

Los métodos de agregación de propósito único son métodos que se aplican en una sola colección. Los métodos son simples, pero carecen de las capacidades de tuberías.

A continuación algunos de los operadores más utilizados en propósitos únicos:

  • count: Contar documentos
  • distinct: Obtención de documentos distintos.

count

Para contar documentos se utiliza el método count, este simplemente retorna un recuento del número de documentos existentes.

db.users.count();

// Resultado
[
{
"result": 3
}
]

distinct

Para obtener una matriz de documentos que tienen valores distintos, se utiliza el método distinct, este método debe recibir el campo especificado.

db.users.distinct("name");
// Resultado
[
"Diego",
"Franco",
"Juan"
]

Código fuente

Recursos de agregaciones y tuberías

Gracias por haber llegado hasta aquí, si encuentras esto útil, no olvides aplaudir 👏 . Suscríbete para obtener más contenido 🔔.

Si necesita ayuda adicional, comunícate conmigo 🤠.

Muchas gracias por leer, agradezco su tiempo.

--

--

diego.coder26

Hello, my name is Diego! 👦, I am Software Engineer that writes about computer science, mathematics, and personal growth. 👉 😃 linktr.ee/diego.coder