네, MongoDB에서 $match는 집계(aggregate) 쿼리 내에서 정상적으로 작동합니다. $match는 집계 파이프라인에서 특정 조건에 맞는 문서만 필터링하는 역할을 하며, 일반 find() 쿼리의 조건과 유사한 방식으로 사용됩니다.
실제 동작 과정을 이해하기 위해 문서가 포함된 컬렉션을 먼저 생성해 보겠습니다.
1. 컬렉션 생성 및 문서 삽입
> db.demo358.insertOne({"ClientId":101,"ClientName":"Chris","ClientAge":34});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5692c0f8647eb59e5620cb")
}
> db.demo358.insertOne({"ClientId":102,"ClientName":"David","ClientAge":32});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5692caf8647eb59e5620cc")
}
> db.demo358.insertOne({"ClientId":103,"ClientName":"David","ClientAge":35});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5692d2f8647eb59e5620cd")
}
> db.demo358.insertOne({"ClientId":104,"ClientName":"Bob","ClientAge":31});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5692ddf8647eb59e5620ce")
}
> db.demo358.insertOne({"ClientId":105,"ClientName":"Chris","ClientAge":36});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5692e7f8647eb59e5620cf")
}2. find() 메서드로 전체 문서 조회
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo358.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e5692c0f8647eb59e5620cb"), "ClientId" : 101, "ClientName" : "Chris", "ClientAge" : 34 }
{ "_id" : ObjectId("5e5692caf8647eb59e5620cc"), "ClientId" : 102, "ClientName" : "David", "ClientAge" : 32 }
{ "_id" : ObjectId("5e5692d2f8647eb59e5620cd"), "ClientId" : 103, "ClientName" : "David", "ClientAge" : 35 }
{ "_id" : ObjectId("5e5692ddf8647eb59e5620ce"), "ClientId" : 104, "ClientName" : "Bob", "ClientAge" : 31 }
{ "_id" : ObjectId("5e5692e7f8647eb59e5620cf"), "ClientId" : 105, "ClientName" : "Chris", "ClientAge" : 36 }3. 집계 파이프라인에서 $match 활용하기
이제 aggregate() 안에서 $match를 사용하여 ClientName이 "David"인 문서만 필터링하고, 이어지는 $count 단계에서 해당 문서의 개수를 세어 보겠습니다.
> db.demo358.aggregate(
... [ { $match : { "ClientName" : "David" }},
... { "$count": "ClientName" }
... ]
... );실행 결과는 다음과 같습니다.
{ "ClientName" : 2 }결과 분석
출력 결과를 보면 ClientName이 "David"인 문서가 총 2개(ClientId 102와 103) 있음을 확인할 수 있습니다. 즉, $match가 조건에 맞는 문서를 정확히 걸러냈고, $count가 그 개수를 반환한 것입니다.
이처럼 $match는 집계 파이프라인의 초기 단계에 배치하면 불필요한 문서를 조기에 제거하여 전체 집계 연산의 성능을 높이는 데도 큰 도움이 됩니다. 인덱스가 설정된 필드에 $match를 적용하면 인덱스를 활용해 더욱 빠른 필터링이 가능합니다.