Utilisation de l'étape $Match(Aggregation) dans MongoDB

Mehvish Ashiq 30 janvier 2023
  1. Utilisation de l’étape $match (Aggregation) dans MongoDB
  2. Utilisez $match avec l’opérateur de comparaison dans MongoDB
  3. Utiliser $match avec l’étape $project dans MongoDB
  4. Utilisez $match avec l’opérateur $and dans MongoDB
  5. Utilisez $match avec l’opérateur $or dans MongoDB
  6. Utiliser l’agrégation $match avec $group dans MongoDB
  7. Utiliser l’agrégation $match avec $month et $year dans MongoDB
Utilisation de l'étape $Match(Aggregation) dans MongoDB

Ce didacticiel décrit brièvement l’étape d’agrégation $match et montre comment utiliser l’étape $match en considérant différents scénarios.

Utilisation de l’étape $match (Aggregation) dans MongoDB

L’étape $match permet de filtrer les documents (enregistrements) qui correspondent à la condition (ou à l’ensemble de conditions) spécifiée. Seuls les documents correspondants passeront à l’étape suivante d’un pipeline.

Préparons une collection contenant quelques documents à apprendre via des exemples de code.

Exemple de code :

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();

Production:

{
        "_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")
}

Nous pouvons aller de l’avant et utiliser l’étape d’agrégation $match pour apprendre une fois que nous avons fini de créer une collection et d’y insérer des documents. Considérant diverses situations, utilisons l’étape $match pour mieux apprendre.

Utilisez $match avec l’opérateur de comparaison dans MongoDB

Exemple de code :

db.employee.aggregate([
   {
       $match:{ "emp_age": { $gt:35 }}
   }
]).pretty();

Production:

{
        "_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")
}

Ici, nous n’obtenons que les documents où emp_age (âge de l’employé) est supérieur à 35 ans. La fonction pretty() ne fait rien mais affiche la sortie de manière organisée.

Utiliser $match avec l’étape $project dans MongoDB

Exemple de code :

db.employee.aggregate([
  {
     $match: {
        "emp_age": { $gt:35 }
     }
  },
  {
     $project:{
        "_id": 0,
        "emp_code": 1,
        "emp_age": 1
     }
  }
]);

Production:

{ "emp_code" : "tc002", "emp_age" : 40 }
{ "emp_code" : "km003", "emp_age" : 45 }
{ "emp_code" : "za005", "emp_age" : 45 }

Cet extrait de code est similaire à l’exemple précédent avec l’utilisation supplémentaire de l’étape $project qui spécifie quels champs doivent être renvoyés par la requête. L’utilisation de 1 et de 0 dans l’étape $project indique respectivement l’inclusion et la suppression du champ.

N’oubliez pas que les documents retournés par la première étape ne seront traités qu’à l’étape suivante. Nous obtenons le emp_code et emp_age de tous les documents où le emp_age (âge de l’employé) est supérieur à 35 ans.

Utilisez $match avec l’opérateur $and dans MongoDB

Exemple de code :

db.employee.aggregate([
  {
      $match:{
          $and: [
              { "emp_age": {$gte:32 }},
              { "emp_grade": {$gt: 20}}
          ]
      }
  },
  {
      $project:{
          "_id": 0,
          "emp_age": 1,
          "emp_grade": 1
      }
  }
]);

Production:

{ "emp_age" : 35, "emp_grade" : 22 }

Cet exemple renvoie emp_age et emp_grade à partir des documents où emp_age est supérieur ou égal à 32 et emp_grade est supérieur à 20. N’oubliez pas que les documents résultants doivent remplir les deux conditions.

Utilisez $match avec l’opérateur $or dans MongoDB

Exemple de code :

db.employee.aggregate([
  {
      $match:{
           $or: [
               { "emp_age": {$gte:32 }},
               { "emp_grade": {$gt: 20}}
           ]
       }
  },
  {
      $project:{
          "_id": 0,
          "emp_age": 1,
          "emp_grade": 1
      }
  }
]);

Production:

{ "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 }

Cet extrait de code est similaire au précédent, mais nous utilisons ici l’opérateur $or. Ici, les documents résultants doivent remplir au moins une condition ou les deux.

Utiliser l’agrégation $match avec $group dans MongoDB

Exemple de code :

db.employee.aggregate([
  {
      $match:{
           $or: [
               { "emp_age": {$gte:32 }},
               { "emp_grade": {$gt: 20}}
           ]
       }
  },
  {
      $group:{
         _id: '$emp_grade',
         Employees: { $sum: 1 } }
  }
]);

Production:

{ _id: 18, Employees: 1 }
{ _id: 20, Employees: 2 }
{ _id: 19, Employees: 1 }
{ _id: 22, Employees: 1 }

Premièrement, nous obtenons les documents où emp_age est supérieur ou égal à 32, emp_grade est supérieur à 20, ou les deux. Le document remplissant la ou les conditions sera également inclus dans le jeu de résultats.

Ces documents résultants seront déplacés vers l’étape suivante, le $group que nous utilisons pour regrouper les documents w.r.t. le grade de l’employé. Dans l’étape $group, nous enregistrons la valeur de emp_grade dans _id et le décompte pour ce grade spécifique dans la variable Employees.

Utiliser l’agrégation $match avec $month et $year dans MongoDB

Exemple de code :

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 }
      }
  }

]);

Production:

{ _id: { year: 2012, month: 8 }, EmployeesCount: 2 }
{ _id: { year: 2014, month: 10 }, EmployeesCount: 1 }
{ _id: { year: 2014, month: 3 }, EmployeesCount: 1 }

Cet extrait de code final contient tous les concepts expliqués précédemment dans ce didacticiel. Ici, nous utilisons trois étapes qui sont expliquées ci-dessous.

Tout d’abord, nous utilisons l’étape d’agrégation $match pour obtenir tous les documents où le emp_joindate est supérieur ou égal au 2012-01-01 et inférieur au 2014-12-30. En ce qui concerne la fonction ISODate(), il s’agit d’une fonction d’assistance utilisée pour envelopper l’objet JavaScript natif DATE.

Chaque fois que nous utilisons le constructeur ISODate() sur le shell Mongo, il renvoie l’objet DATE de JavaScript. Les documents résultants de l’étape $match sont envoyés à l’étape $project.

A l’étape d’agrégation $project, nous spécifions quels champs des documents doivent être retournés. De plus, nous extrayons l’année et le mois de emp_joindate en utilisant respectivement $year et $month.

Ensuite, nous sauvegardons le mois et l’année extraits dans la variable new_created. Les résultats de cette étape sont passés à l’étape d’agrégation $group.

Nous regroupons le document à l’étape $group pour savoir combien d’employés ont été nommés au cours d’un mois et d’une année spécifiques.

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

Article connexe - MongoDB Match