MongoDB での$Match(Aggregation)ステージの使用
-
MongoDB での
$match
(Aggregation)ステージの使用 -
MongoDB の比較演算子で
$match
を使用する -
MongoDB の
$project
ステージで$match
を使用する -
MongoDB の
$and
演算子で$match
を使用する -
MongoDB の
$or
演算子で$match
を使用する -
MongoDB で
$match
集約を$group
で使用する -
MongoDB で
$match
集約を$month
と$year
で使用する
このチュートリアルでは、$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
ステージで 1
と 0
を使用することは、それぞれフィールドの包含と抑制を示します。
最初のステージで返されたドキュメントは、次のステージでのみ処理されることに注意してください。emp_age
(従業員の年齢)が 35 を超えるすべてのドキュメントから、emp_code
と emp_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_age
と emp_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_joindate
が 2012-01-01
以上で 2014-12-30
未満のすべてのドキュメントを取得します。ISODate()
関数に関する限り、これはネイティブ JavaScript の DATE
オブジェクトをラップするために使用されるヘルパー関数です。
Mongo シェルで ISODate()
コンストラクターを使用すると、JavaScript の DATE
オブジェクトが返されます。 $match
ステージの結果のドキュメントは、$project
ステージに送信されます。
$project
集計段階で、ドキュメントのどのフィールドを返すかを指定します。また、$year
と $month
をそれぞれ使用して、emp_joindate
から年と月を抽出します。
次に、抽出した月と年を new_created
変数に保存します。この段階での結果は、$group
集計段階に渡されます。
$group
の段階でドキュメントをグループ化し、特定の月と年に何人の従業員が任命されたかを確認します。