Utilisation de l'étape $Match(Aggregation) dans MongoDB
-
Utilisation de l’étape
$match
(Aggregation) dans MongoDB -
Utilisez
$match
avec l’opérateur de comparaison dans MongoDB -
Utiliser
$match
avec l’étape$project
dans MongoDB -
Utilisez
$match
avec l’opérateur$and
dans MongoDB -
Utilisez
$match
avec l’opérateur$or
dans MongoDB -
Utiliser l’agrégation
$match
avec$group
dans MongoDB -
Utiliser l’agrégation
$match
avec$month
et$year
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.