MongoDB에서 $Match(Aggregation) 단계 사용

Mehvish Ashiq 2023년1월30일
  1. MongoDB에서 $match(Aggregation) 단계 사용
  2. MongoDB에서 비교 연산자와 함께 $match 사용
  3. MongoDB에서 $project 스테이지와 함께 $match 사용
  4. MongoDB에서 $and 연산자와 함께 $match 사용
  5. MongoDB에서 $or 연산자와 함께 $match 사용
  6. MongoDB에서 $group과 함께 $match 집계 사용
  7. MongoDB에서 $month$year와 함께 $match 집계 사용
MongoDB에서 $Match(Aggregation) 단계 사용

이 튜토리얼에서는 $match 집계 단계에 대해 간략하게 설명하고 다양한 시나리오를 고려하여 $match 단계를 사용하는 방법을 보여줍니다.

MongoDB에서 $match(Aggregation) 단계 사용

$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에서 $project 스테이지와 함께 $match 사용

예제 코드:

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에서 $and 연산자와 함께 $match 사용

예제 코드:

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에서 $or 연산자와 함께 $match 사용

예제 코드:

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에서 $group과 함께 $match 집계 사용

예제 코드:

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으로 이동하여 문서를 w.r.t로 그룹화하는 데 사용합니다. 직원의 등급. $group 단계에서 emp_grade 값을 _id에 저장하고 특정 등급에 대한 개수를 Employees 변수에 저장합니다.

MongoDB에서 $month$year와 함께 $match 집계 사용

예제 코드:

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_joindate2012-01-01보다 크거나 같고 2014-12-30보다 작은 모든 문서를 가져옵니다. ISODate() 함수에 관한 한 기본 JavaScript DATE 객체를 래핑하는 데 사용되는 도우미 함수입니다.

Mongo 셸에서 ISODate() 생성자를 사용할 때마다 JavaScript의 DATE 객체를 반환합니다. $match 단계의 결과 문서는 $project 단계로 전송됩니다.

$project 집계 단계에서 문서의 어떤 필드를 반환해야 하는지 지정합니다. 또한 $year$month를 사용하여 emp_joindate에서 연도와 월을 각각 추출합니다.

그런 다음 추출된 월과 연도를 new_created 변수에 저장합니다. 이 단계의 결과는 $group 집계 단계로 전달됩니다.

$group 단계에서 문서를 그룹화하여 특정 월 및 연도에 몇 명의 직원이 임명되었는지 알 수 있습니다.

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