Uso de la etapa $Match(Aggregation) en MongoDB
-
Uso de la etapa
$match
(agregación) en MongoDB -
Use
$match
con el operador de comparación en MongoDB -
Use
$match
con la etapa$project
en MongoDB -
Use
$match
con el operador$and
en MongoDB -
Use
$match
con el operador$or
en MongoDB -
Use la agregación
$match
con$group
en MongoDB -
Use la agregación
$match
con$month
y$year
en MongoDB
Este tutorial analiza brevemente la etapa de agregación $match
y demuestra el uso de la etapa $match
considerando diferentes escenarios.
Uso de la etapa $match
(agregación) en MongoDB
La etapa $match
nos permite filtrar los documentos (registros) que coinciden con la condición (o conjunto de condiciones) especificada. Solo los documentos coincidentes pasarán a la siguiente etapa de una pipeline.
Preparemos una colección que contenga algunos documentos para aprender a través de ejemplos de código.
Código de ejemplo:
db.createCollection('employee');
db.employee.insertMany([
{
"emp_code": "ma001",
"emp_age": 30,
"emp_grade": 18,
"emp_joindate": ISODate('2012-08-16T00:00:00Z')
},
{
"emp_code": "tc002",
"emp_age": 40,
"emp_grade":19,
"emp_joindate": ISODate('2011-08-16T00:00:00Z')
},
{
"emp_code": "km003",
"emp_age": 45,
"emp_grade":18,
"emp_joindate": ISODate('2012-08-26T00:00:00Z')
},
{
"emp_code": "ar004",
"emp_age": 32,
"emp_grade":20,
"emp_joindate": ISODate('2014-10-06T00:00:00Z')
},
{
"emp_code": "za005",
"emp_age": 45,
"emp_grade":20,
"emp_joindate": ISODate('2014-03-11T00:00:00Z')
},
{
"emp_code": "ka006",
"emp_age": 35,
"emp_grade": 22,
"emp_joindate": ISODate('2018-06-16T00:00:00Z')
}
]);
db.employee.find().pretty();
Producción :
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a0"),
"emp_code" : "ma001",
"emp_age" : 30,
"emp_grade" : 18,
"emp_joindate" : ISODate("2012-08-16T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a1"),
"emp_code" : "tc002",
"emp_age" : 40,
"emp_grade" : 19,
"emp_joindate" : ISODate("2011-08-16T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a2"),
"emp_code" : "km003",
"emp_age" : 45,
"emp_grade" : 18,
"emp_joindate" : ISODate("2012-08-26T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a3"),
"emp_code" : "ar004",
"emp_age" : 32,
"emp_grade" : 20,
"emp_joindate" : ISODate("2014-10-06T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a4"),
"emp_code" : "za005",
"emp_age" : 45,
"emp_grade" : 20,
"emp_joindate" : ISODate("2014-03-11T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a5"),
"emp_code" : "ka006",
"emp_age" : 35,
"emp_grade" : 22,
"emp_joindate" : ISODate("2018-06-16T00:00:00Z")
}
Podemos avanzar y usar la etapa de agregación $match
para aprender una vez que hayamos terminado de crear una colección e insertar documentos en ella. Considerando varias situaciones, usemos la etapa $match
para aprender mejor.
Use $match
con el operador de comparación en MongoDB
Código de ejemplo:
db.employee.aggregate([
{
$match:{ "emp_age": { $gt:35 }}
}
]).pretty();
Producción :
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a1"),
"emp_code" : "tc002",
"emp_age" : 40,
"emp_grade" : 19,
"emp_joindate" : ISODate("2011-08-16T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a2"),
"emp_code" : "km003",
"emp_age" : 45,
"emp_grade" : 18,
"emp_joindate" : ISODate("2012-08-26T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a4"),
"emp_code" : "za005",
"emp_age" : 45,
"emp_grade" : 20,
"emp_joindate" : ISODate("2014-03-11T00:00:00Z")
}
Aquí, solo obtenemos aquellos documentos en los que emp_age
(edad del empleado) es mayor de 35 años. La función pretty()
no hace nada más que mostrar el resultado de forma organizada.
Use $match
con la etapa $project
en MongoDB
Código de ejemplo:
db.employee.aggregate([
{
$match: {
"emp_age": { $gt:35 }
}
},
{
$project:{
"_id": 0,
"emp_code": 1,
"emp_age": 1
}
}
]);
Producción :
{ "emp_code" : "tc002", "emp_age" : 40 }
{ "emp_code" : "km003", "emp_age" : 45 }
{ "emp_code" : "za005", "emp_age" : 45 }
Este fragmento de código es similar al ejemplo anterior con el uso adicional de la etapa $project
que especifica qué campos deben devolverse de la consulta. El uso de 1
y 0
en la etapa $project
denota la inclusión y supresión del campo, respectivamente.
Recuerde que los documentos devueltos por la primera etapa solo serán procesados en la siguiente etapa. Obtenemos el emp_code
y emp_age
de todos aquellos documentos en los que emp_age
(edad del empleado) es mayor de 35 años.
Use $match
con el operador $and
en MongoDB
Código de ejemplo:
db.employee.aggregate([
{
$match:{
$and: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$project:{
"_id": 0,
"emp_age": 1,
"emp_grade": 1
}
}
]);
Producción :
{ "emp_age" : 35, "emp_grade" : 22 }
Este ejemplo devuelve el emp_age
y emp_grade
de aquellos documentos donde emp_age
es mayor o igual a 32, y emp_grade
es mayor a 20. Recuerda, los documentos resultantes deben cumplir ambas condiciones.
Use $match
con el operador $or
en MongoDB
Código de ejemplo:
db.employee.aggregate([
{
$match:{
$or: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$project:{
"_id": 0,
"emp_age": 1,
"emp_grade": 1
}
}
]);
Producción :
{ "emp_age" : 40, "emp_grade" : 19 }
{ "emp_age" : 45, "emp_grade" : 18 }
{ "emp_age" : 32, "emp_grade" : 20 }
{ "emp_age" : 45, "emp_grade" : 20 }
{ "emp_age" : 35, "emp_grade" : 22 }
Este fragmento de código es similar al anterior, pero aquí usamos el operador $or
. Aquí, los documentos resultantes deben cumplir al menos una condición o ambas.
Use la agregación $match
con $group
en MongoDB
Código de ejemplo:
db.employee.aggregate([
{
$match:{
$or: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$group:{
_id: '$emp_grade',
Employees: { $sum: 1 } }
}
]);
Producción :
{ _id: 18, Employees: 1 }
{ _id: 20, Employees: 2 }
{ _id: 19, Employees: 1 }
{ _id: 22, Employees: 1 }
Primero, obtenemos aquellos documentos donde emp_age
es mayor o igual a 32, emp_grade
es mayor a 20, o ambos. El documento que satisfaga las condiciones también se incluirá en el conjunto de resultados.
Estos documentos resultantes pasarán a la siguiente etapa, el $group
que estamos usando para agrupar los documentos w.r.t. el grado del empleado. En la etapa $group
, guardamos el valor de emp_grade
en _id
y el recuento de ese grado específico en la variable Employees
.
Use la agregación $match
con $month
y $year
en MongoDB
Código de ejemplo:
db.employee.aggregate([
{
$match: {
"emp_joindate" : {
$gte:ISODate('2012-01-01'),
$lt: ISODate('2014-12-30')
}
}
},
{
$project:{
"_id": 0,
"emp_code": 1,
"emp_age": 1,
"emp_grade": 1,
"new_created": {
"year" : {"$year" : "$emp_joindate"},
"month" : {"$month" : "$emp_joindate"}
}
}
},
{
$group:{
_id: "$new_created",
EmployeesCount:{ $sum:1 }
}
}
]);
Producción :
{ _id: { year: 2012, month: 8 }, EmployeesCount: 2 }
{ _id: { year: 2014, month: 10 }, EmployeesCount: 1 }
{ _id: { year: 2014, month: 3 }, EmployeesCount: 1 }
Este fragmento de código final contiene todos los conceptos explicados anteriormente en este tutorial. Aquí, estamos usando tres etapas que se explican a continuación.
Primero, usamos la etapa de agregación $match
para obtener todos aquellos documentos donde emp_joindate
es mayor o igual que 2012-01-01
y menor que 2014-12-30
. En lo que respecta a la función ISODate()
, es una función auxiliar que se utiliza para envolver el objeto nativo DATE
de JavaScript.
Cada vez que usamos el constructor ISODate()
en el shell de Mongo, devuelve el objeto DATE
de JavaScript. Los documentos resultantes de la etapa $match
se envían a la etapa $project
.
En la etapa de agregación $proyecto
, especificamos qué campos de los documentos deben devolverse. Además, extraemos el año y el mes de emp_joindate
usando $year
y $month
, respectivamente.
Luego, guardamos el mes y el año extraídos en la variable new_created
. Los resultados de esta etapa se pasan a la etapa de agregación $group
.
Agrupamos el documento en la etapa $group
para saber cuántos empleados fueron nombrados en un mes y año específico.