MongoDB에서 $Match(Aggregation) 단계 사용
-
MongoDB에서
$match
(Aggregation) 단계 사용 -
MongoDB에서 비교 연산자와 함께
$match
사용 -
MongoDB에서
$project
스테이지와 함께$match
사용 -
MongoDB에서
$and
연산자와 함께$match
사용 -
MongoDB에서
$or
연산자와 함께$match
사용 -
MongoDB에서
$group
과 함께$match
집계 사용 -
MongoDB에서
$month
및$year
와 함께$match
집계 사용
이 튜토리얼에서는 $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 }
이 코드 조각은 이전 조각과 유사하지만 여기에서는 $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_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
단계에서 문서를 그룹화하여 특정 월 및 연도에 몇 명의 직원이 임명되었는지 알 수 있습니다.