Uso de la etapa $Match(Aggregation) en MongoDB

Mehvish Ashiq 30 enero 2023
  1. Uso de la etapa $match (agregación) en MongoDB
  2. Use $match con el operador de comparación en MongoDB
  3. Use $match con la etapa $project en MongoDB
  4. Use $match con el operador $and en MongoDB
  5. Use $match con el operador $or en MongoDB
  6. Use la agregación $match con $group en MongoDB
  7. Use la agregación $match con $month y $year en MongoDB
Uso de la etapa $Match(Aggregation) 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.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - MongoDB Match