MongoDB 집계 프레임워크에서 특정 필드 값 일치시키기
MongoDB의 집계 프레임워크(aggregation framework)에서 특정 필드 값과 일치하는 문서를 조회하려면 $match 스테이지를 사용합니다. 이번 글에서는 예제 컬렉션을 만들고, $match와 $group을 조합하여 원하는 조건의 문서를 필터링하고 개수까지 집계하는 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 demo555라는 컬렉션을 생성하고, CountryName 필드를 가진 여러 문서를 삽입합니다.
> db.demo555.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21bf54b4472ed3e8e85f")
}
> db.demo555.insertOne({"CountryName":"UK"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c254b4472ed3e8e860")
}
> db.demo555.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c354b4472ed3e8e861")
}
> db.demo555.insertOne({"CountryName":"AUS"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c554b4472ed3e8e862")
}
> db.demo555.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c754b4472ed3e8e863")
}총 5개의 문서가 삽입되었으며, 그중 CountryName이 "US"인 문서는 3개입니다.
2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo555.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8f21bf54b4472ed3e8e85f"), "CountryName" : "US" }
{ "_id" : ObjectId("5e8f21c254b4472ed3e8e860"), "CountryName" : "UK" }
{ "_id" : ObjectId("5e8f21c354b4472ed3e8e861"), "CountryName" : "US" }
{ "_id" : ObjectId("5e8f21c554b4472ed3e8e862"), "CountryName" : "AUS" }
{ "_id" : ObjectId("5e8f21c754b4472ed3e8e863"), "CountryName" : "US" }3. $match로 특정 필드 값 일치시키기
이제 집계 파이프라인에서 $match를 사용해 CountryName 필드 값이 "US"인 문서만 걸러낸 뒤, $group으로 해당 문서의 개수를 합산해 보겠습니다.
> db.demo555.aggregate([
... {$match: {CountryName: 'US'}},
... {$group: {_id: null, Total: {$sum: 1}}}
... ])쿼리 실행 결과는 다음과 같습니다.
{ "_id" : null, "Total" : 3 }쿼리 동작 방식 정리
- $match: SQL의 WHERE 절과 유사하게, 지정한 조건(
CountryName: 'US')과 일치하는 문서만 다음 스테이지로 전달합니다. - $group:
_id: null로 설정하면 통과된 모든 문서를 하나의 그룹으로 묶고,$sum: 1을 통해 문서 개수를 계산합니다.
결과적으로 Total: 3이 반환되며, 이는 CountryName이 "US"인 문서가 총 3개 존재한다는 의미입니다. 이처럼 $match를 집계 파이프라인 앞부분에 배치하면 불필요한 문서를 조기에 걸러내므로 집계 성능 최적화에도 큰 도움이 됩니다.