Verwendung der Phase $Match(Aggregation) in MongoDB
-
Verwendung der Stufe
$match
(Aggregation) in MongoDB -
Verwendung von
$match
mit dem Vergleichsoperator in MongoDB -
Verwendung von
$match
mit$project
Stage in MongoDB -
Verwendung von
$match
mit dem Operator$and
in MongoDB -
Verwendung von
$match
mit dem Operator$or
in MongoDB -
Verwendung von die
$match
-Aggregation mit$group
in MongoDB -
Verwendung von die
$match
-Aggregation mit$month
und$year
in MongoDB
Dieses Tutorial behandelt kurz die Aggregationsstufe $match
und demonstriert die Verwendung der Stufe $match
unter Berücksichtigung verschiedener Szenarien.
Verwendung der Stufe $match
(Aggregation) in MongoDB
Die Phase $match
ermöglicht es uns, die Dokumente (Datensätze) zu filtern, die der angegebenen Bedingung (oder einer Reihe von Bedingungen) entsprechen. Nur übereinstimmende Dokumente werden zur nächsten Stufe einer Pipeline weitergeleitet.
Bereiten wir eine Sammlung vor, die einige Dokumente enthält, die Sie anhand von Codebeispielen lernen können.
Beispielcode:
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();
Ausgabe:
{
"_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")
}
Wir können fortfahren und die Aggregationsphase $match
verwenden, um zu lernen, sobald wir mit dem Erstellen einer Sammlung und dem Einfügen von Dokumenten darin fertig sind. Lassen Sie uns unter Berücksichtigung verschiedener Situationen die Phase $match
nutzen, um besser zu lernen.
Verwendung von $match
mit dem Vergleichsoperator in MongoDB
Beispielcode:
db.employee.aggregate([
{
$match:{ "emp_age": { $gt:35 }}
}
]).pretty();
Ausgabe:
{
"_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")
}
Hier erhalten wir nur die Dokumente, bei denen emp_age
(Alter des Mitarbeiters) grösser als 35 ist. Die Funktion pretty()
tut nichts anderes, als die Ausgabe auf organisierte Weise anzuzeigen.
Verwendung von $match
mit $project
Stage in MongoDB
Beispielcode:
db.employee.aggregate([
{
$match: {
"emp_age": { $gt:35 }
}
},
{
$project:{
"_id": 0,
"emp_code": 1,
"emp_age": 1
}
}
]);
Ausgabe:
{ "emp_code" : "tc002", "emp_age" : 40 }
{ "emp_code" : "km003", "emp_age" : 45 }
{ "emp_code" : "za005", "emp_age" : 45 }
Dieses Code-Snippet ähnelt dem vorherigen Beispiel mit der zusätzlichen Verwendung der Stufe $project
, die angibt, welche Felder von der Abfrage zurückgegeben werden sollen. Die Verwendung von 1
und 0
in der Stufe $project
bezeichnet die Einbeziehung bzw. Unterdrückung des Felds.
Denken Sie daran, dass die von der ersten Stufe zurückgegebenen Dokumente erst in der nächsten Stufe verarbeitet werden. Wir erhalten den emp_code
und das emp_age
von all jenen Dokumenten, bei denen das emp_age
(Alter des Mitarbeiters) größer als 35 ist.
Verwendung von $match
mit dem Operator $and
in MongoDB
Beispielcode:
db.employee.aggregate([
{
$match:{
$and: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$project:{
"_id": 0,
"emp_age": 1,
"emp_grade": 1
}
}
]);
Ausgabe:
{ "emp_age" : 35, "emp_grade" : 22 }
Dieses Beispiel gibt emp_age
und emp_grade
aus den Dokumenten zurück, bei denen emp_age
größer oder gleich 32 und emp_grade
größer als 20 ist. Denken Sie daran, dass die resultierenden Dokumente beide Bedingungen erfüllen müssen.
Verwendung von $match
mit dem Operator $or
in MongoDB
Beispielcode:
db.employee.aggregate([
{
$match:{
$or: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$project:{
"_id": 0,
"emp_age": 1,
"emp_grade": 1
}
}
]);
Ausgabe:
{ "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 }
Dieses Code-Snippet ähnelt dem vorherigen, aber wir verwenden hier den Operator $or
. Hier müssen die resultierenden Dokumente mindestens eine Bedingung oder beide erfüllen.
Verwendung von die $match
-Aggregation mit $group
in MongoDB
Beispielcode:
db.employee.aggregate([
{
$match:{
$or: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$group:{
_id: '$emp_grade',
Employees: { $sum: 1 } }
}
]);
Ausgabe:
{ _id: 18, Employees: 1 }
{ _id: 20, Employees: 2 }
{ _id: 19, Employees: 1 }
{ _id: 22, Employees: 1 }
Zuerst erhalten wir die Dokumente, bei denen emp_age
größer oder gleich 32, emp_grade
größer als 20 oder beides ist. Das Dokument, das die Bedingung(en) erfüllt, wird ebenfalls in die Ergebnismenge aufgenommen.
Diese resultierenden Dokumente werden in die nächste Stufe verschoben, die $group
, die wir verwenden, um die Dokumente bzgl. die Note des Mitarbeiters. In der Phase $group
speichern wir den Wert von emp_grade
in _id
und die Anzahl für diese bestimmte Besoldungsgruppe in der Variablen Employees
.
Verwendung von die $match
-Aggregation mit $month
und $year
in MongoDB
Beispielcode:
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 }
}
}
]);
Ausgabe:
{ _id: { year: 2012, month: 8 }, EmployeesCount: 2 }
{ _id: { year: 2014, month: 10 }, EmployeesCount: 1 }
{ _id: { year: 2014, month: 3 }, EmployeesCount: 1 }
Dieses abschließende Code-Snippet enthält alle zuvor in diesem Tutorial erläuterten Konzepte. Hier verwenden wir drei Stufen, die im Folgenden erläutert werden.
Zuerst verwenden wir die Aggregationsstufe $match
, um all jene Dokumente zu erhalten, bei denen emp_joindate
größer oder gleich 2012-01-01
und kleiner als 2014-12-30
ist. Was die ISODate()
-Funktion betrifft, handelt es sich um eine Hilfsfunktion, die verwendet wird, um das native JavaScript DATE
-Objekt zu umschließen.
Immer wenn wir den Konstruktor ISODate()
auf der Mongo-Shell verwenden, gibt er das DATE
-Objekt von JavaScript zurück. Die resultierenden Dokumente der Stufe $match
werden an die Stufe $project
gesendet.
In der Aggregationsstufe $project
geben wir an, welche Felder der Dokumente zurückgegeben werden sollen. Außerdem extrahieren wir das Jahr und den Monat aus dem emp_joindate
mit $year
bzw. $month
.
Dann speichern wir den extrahierten Monat und das Jahr in der Variablen new_created
. Die Ergebnisse dieser Stufe werden an die Aggregationsstufe $group
übergeben.
Wir gruppieren das Dokument in der Stufe $group
, um zu wissen, wie viele Mitarbeiter in einem bestimmten Monat und Jahr eingestellt wurden.