MongoDB 집계에서 $match와 $project의 역할
MongoDB의 애그리게이션(집계) 파이프라인에서 $match는 지정된 조건과 일치하는 문서만 필터링하여 다음 파이프라인 단계로 전달하는 역할을 합니다. SQL의 WHERE 절과 유사한 기능이라고 생각하면 이해하기 쉽습니다.
반면 $project는 요청된 필드만 포함한 문서를 다음 단계로 전달합니다. 즉, 결과에 포함할 필드를 선택하거나 제외하고, 새로운 형태로 필드를 재구성할 수 있습니다.
예제 컬렉션 생성
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo545.insert({Name:"Chris",details:{SubjectScore1:56,SubjectScore2:56}})
WriteResult({ "nInserted" : 1 })
> db.demo545.insert({Name:"David",details:{SubjectScore1:78,SubjectScore2:78}})
WriteResult({ "nInserted" : 1 })find() 메서드로 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo545.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8e246e9e5f92834d7f05d5"), "Name" : "Chris", "details" : { "SubjectScore1" : 56, "SubjectScore2" : 56 } }
{ "_id" : ObjectId("5e8e24709e5f92834d7f05d6"), "Name" : "David", "details" : { "SubjectScore1" : 78, "SubjectScore2" : 78 } }$match와 $project를 함께 사용하는 쿼리
이제 $match와 $project를 조합한 애그리게이션 쿼리를 살펴보겠습니다.
>db.demo545.aggregate([{$match:{}},{$project:{"_id":0,"details.SubjectScore1":1,out:"$details.SubjectScore2"}},{$group:{_id:"$out"}}])위 쿼리의 동작 과정은 다음과 같습니다.
1. $match:{} — 빈 조건이므로 모든 문서가 통과됩니다.
2. $project — _id 필드는 제외하고(0), details.SubjectScore1은 포함하며(1), details.SubjectScore2 값을 out이라는 새로운 필드로 매핑합니다.
3. $group — out 필드 값을 기준으로 문서를 그룹화합니다.
쿼리 실행 결과는 다음과 같습니다.
{ "_id" : 78 }
{ "_id" : 56 }결과를 보면 SubjectScore2의 값인 78과 56이 각각 그룹화되어 출력된 것을 확인할 수 있습니다. 이처럼 $match로 문서를 필터링하고, $project로 필요한 필드만 추출·재구성한 뒤, $group으로 데이터를 요약하는 방식은 MongoDB 애그리게이션 파이프라인에서 가장 널리 사용되는 패턴 중 하나입니다.