MongoDB에서 두 개의 열을 기준으로 그룹화하기
두 개의 열(필드)에 걸쳐 데이터를 그룹화하려면 $lookup 연산자를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 동일한 컬렉션 안에서 서로 다른 두 필드를 연결하고 값을 합산하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 예제로 사용할 문서들이 담긴 컬렉션을 생성합니다.
> db.demo132.insertOne({"CountryName1":"US","CountryName2":"UK",Value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31950468e7f832db1a7f75")
}
> db.demo132.insertOne({"CountryName1":"UK","CountryName2":"AUS",Value:10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31951d68e7f832db1a7f76")
}
> db.demo132.insertOne({"CountryName1":"AUS","CountryName2":"US",Value:40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31952c68e7f832db1a7f77")
}2. 저장된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo132.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e31950468e7f832db1a7f75"), "CountryName1" : "US", "CountryName2" : "UK", "Value" : 50 }
{ "_id" : ObjectId("5e31951d68e7f832db1a7f76"), "CountryName1" : "UK", "CountryName2" : "AUS", "Value" : 10 }
{ "_id" : ObjectId("5e31952c68e7f832db1a7f77"), "CountryName1" : "AUS", "CountryName2" : "US", "Value" : 40 }3. 두 열을 기준으로 그룹화하는 쿼리
다음은 MongoDB 애그리게이션 파이프라인을 사용해 두 개의 열을 기준으로 그룹화하는 쿼리입니다.
> db.demo132.aggregate( [쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "CountryName1" : "US", "total" : 90 }
{ "CountryName1" : "UK", "total" : 60 }
{ "CountryName1" : "AUS", "total" : 50 }쿼리 동작 원리
이 쿼리는 세 단계로 구성됩니다. 첫째, $lookup이 동일한 컬렉션(demo132) 내에서
CountryName1값과CountryName2값이 일치하는 문서를 조인합니다. 둘째, $unwind가 조인 결과 배열을 개별 문서로 풀어줍니다. 마지막으로 $project 단계에서$sum을 사용해 자기 자신의Value와 매칭된 문서의out.Value를 더해total필드를 계산합니다.예를 들어 US의 경우 자신의 Value(50)와 CountryName2가 US인 문서의 Value(40)가 합쳐져 90이라는 결과가 나옵니다. 이처럼 $lookup을 활용하면 SQL의 셀프 조인(self join)과 유사한 방식으로 두 열에 걸친 그룹화 및 집계를 손쉽게 구현할 수 있습니다.