Verwendung der Phase $Match(Aggregation) in MongoDB

Mehvish Ashiq 13 Juni 2022
  1. Verwendung der Stufe $match (Aggregation) in MongoDB
  2. Verwendung von $match mit dem Vergleichsoperator in MongoDB
  3. Verwendung von $match mit $project Stage in MongoDB
  4. Verwendung von $match mit dem Operator $and in MongoDB
  5. Verwendung von $match mit dem Operator $or in MongoDB
  6. Verwendung von die $match-Aggregation mit $group in MongoDB
  7. Verwendung von die $match-Aggregation mit $month und $year in MongoDB
Verwendung der Phase $Match(Aggregation) 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.

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

Verwandter Artikel - MongoDB Match