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 で $match 集約を $group で使用する
  7. MongoDB で $match 集約を $month$year で使用する
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 }

このコードスニペットは前のコードスニペットと似ていますが、ここでは $または演算子を使用します。ここで、結果のドキュメントは少なくとも 1つまたは両方の条件を満たす必要があります。

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 }

この最終的なコードスニペットには、このチュートリアルで前に説明したすべての概念が含まれています。ここでは、以下に説明する 3つのステージを使用しています。

まず、$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
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