MongoDB 中$Match(聚合)階段的使用

Mehvish Ashiq 2023年1月30日
  1. 在 MongoDB 中使用 $match(聚合)階段
  2. 在 MongoDB 中將 $match 與比較運算子一起使用
  3. 在 MongoDB 中使用 $match$project 階段
  4. 在 MongoDB 中使用 $match$and 運算子
  5. 在 MongoDB 中使用 $match$or 運算子
  6. 在 MongoDB 中使用 $match 聚合與 $group
  7. 在 MongoDB 中使用 $match 聚合與 $month$year
MongoDB 中$Match(聚合)階段的使用

本教程簡要討論了 $match 聚合階段,並演示了考慮不同場景的 $match 階段。

在 MongoDB 中使用 $match(聚合)階段

$match 階段讓我們過濾與指定條件(或條件集)匹配的文件(記錄)。只有匹配的文件才會進入管道的下一階段。

讓我們準備一個包含一些文件的集合,以通過程式碼示例進行學習。

示例程式碼:

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

輸出:

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

一旦我們完成建立集合併在其中插入文件,我們就可以繼續使用 $match 聚合階段來學習。考慮到各種情況,讓我們使用 $match 階段來更好地學習。

在 MongoDB 中將 $match 與比較運算子一起使用

示例程式碼:

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

輸出:

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

在這裡,我們只得到那些 emp_age(員工年齡)大於 35 的文件。pretty() 函式什麼都不做,只是以有組織的方式顯示輸出。

在 MongoDB 中使用 $match$project 階段

示例程式碼:

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

輸出:

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

此程式碼片段類似於前面的示例,但額外使用了 $project 階段,該階段指定應從查詢中返回哪些欄位。在 $project 階段使用 10 分別表示該欄位的包含和抑制。

請記住,第一階段返回的檔案只會在下一階段處理。我們從所有那些 emp_age(員工年齡)大於 35 的文件中獲取 emp_codeemp_age

在 MongoDB 中使用 $match$and 運算子

示例程式碼:

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

輸出:

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

此示例從那些 emp_age 大於或等於 32 且 emp_grade 大於 20 的文件返回 emp_ageemp_grade。請記住,生成的文件必須同時滿足這兩個條件。

在 MongoDB 中使用 $match$or 運算子

示例程式碼:

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

輸出:

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

此程式碼片段與上一個類似,但我們在這裡使用 $or 運算子。在這裡,生成的文件必須滿足至少一個條件或同時滿足這兩個條件。

在 MongoDB 中使用 $match 聚合與 $group

示例程式碼:

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

輸出:

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

首先,我們得到那些 emp_age 大於或等於 32、emp_grade 大於 20 或兩者兼有的文件。滿足條件的文件也將包含在結果集中。

這些生成的文件將移至下一階段,即我們用來對文件進行分組的 $group。員工的等級。在 $group 階段,我們將 emp_grade 的值儲存在 _id 中,並將該特定等級的計數儲存在 Employees 變數中。

在 MongoDB 中使用 $match 聚合與 $month$year

示例程式碼:

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

]);

輸出:

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

這個最終的程式碼片段包含本教程前面解釋的所有概念。在這裡,我們使用下面解釋的三個階段。

首先,我們使用 $match 聚合階段來獲取 emp_joindate 大於或等於 2012-01-01 且小於 2014-12-30 的所有文件。就 ISODate() 函式而言,它是一個幫助函式,用於包裝原生 JavaScript DATE 物件。

每當我們在 Mongo shell 上使用 ISODate() 建構函式時,它都會返回 JavaScript 的 DATE 物件。 $match 階段的結果文件被髮送到 $project 階段。

$project 聚合階段,我們指定應該返回文件的哪些欄位。此外,我們分別使用 $year$monthemp_joindate 中提取年份和月份。

然後,我們將提取的月份和年份儲存在 new_created 變數中。這個階段的結果被傳遞到 $group 聚合階段。

我們在 $group 階段對文件進行分組,以瞭解在特定月份和年份中任命了多少員工。

作者: Mehvish Ashiq
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

相關文章 - MongoDB Match