MongoDB에서 각 그룹의 최대값을 가진 항목을 조회하려면 집계 파이프라인의 $group 연산자와 $max 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 국가(CountryName)별로 최고 점수(Marks)를 구하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 예제에 사용할 문서(document)들을 담은 컬렉션을 생성합니다. insertOne() 메서드를 사용해 학생 이름, 국가, 점수 데이터를 순차적으로 삽입합니다.
> db.demo659.insertOne({Name:"Chris",CountryName:"US","Marks":50});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cf9") }
> db.demo659.insertOne({Name:"David",CountryName:"US","Marks":60});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfa") }
> db.demo659.insertOne({Name:"Mike",CountryName:"US","Marks":55});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfb") }
> db.demo659.insertOne({Name:"Chris",CountryName:"UK","Marks":75});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfc") }
> db.demo659.insertOne({Name:"David",CountryName:"UK","Marks":54});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfd") }
> db.demo659.insertOne({Name:"Mike",CountryName:"UK","Marks":72});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50824113ea5458c7cfe") }2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo659.find();
위 쿼리는 다음과 같은 결과를 출력합니다. 총 6개의 문서가 있으며, US와 UK 두 개의 국가 그룹으로 나뉘어 있는 것을 볼 수 있습니다.
{ "_id" : ObjectId("5ea1a50724113ea5458c7cf9"), "Name" : "Chris", "CountryName" : "US", "Marks" : 50 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfa"), "Name" : "David", "CountryName" : "US", "Marks" : 60 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfb"), "Name" : "Mike", "CountryName" : "US", "Marks" : 55 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfc"), "Name" : "Chris", "CountryName" : "UK", "Marks" : 75 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfd"), "Name" : "David", "CountryName" : "UK", "Marks" : 54 }
{ "_id" : ObjectId("5ea1a50824113ea5458c7cfe"), "Name" : "Mike", "CountryName" : "UK", "Marks" : 72 }3. $group과 $max로 그룹별 최대값 조회하기
이제 각 그룹(국가)별 최대 점수를 구하는 핵심 쿼리입니다. aggregate() 메서드 안에서 $group으로 CountryName 필드를 기준으로 문서들을 묶고, $max 연산자로 각 그룹 내 Marks 필드의 최대값을 계산합니다.
> db.demo659.aggregate( { $group: {
... _id: {CountryName: "$CountryName" },
... 'MaxMarks': { $max : "$Marks" }
... }})4. 실행 결과 확인
쿼리 실행 결과는 다음과 같습니다. UK 그룹의 최고 점수는 75점, US 그룹의 최고 점수는 60점임을 확인할 수 있습니다.
{ "_id" : { "CountryName" : "UK" }, "MaxMarks" : 75 }
{ "_id" : { "CountryName" : "US" }, "MaxMarks" : 60 }정리
MongoDB에서 그룹별 최대값을 구하는 방법을 정리하면 다음과 같습니다.
- $group: 특정 필드를 기준으로 문서를 그룹화합니다.
_id에 그룹화 기준이 되는 필드를 지정합니다. - $max: 각 그룹 내에서 지정한 필드의 최대값을 계산합니다.
- $min, $sum, $avg 등 다른 누적 연산자도 동일한 방식으로 활용할 수 있으니 필요에 따라 조합해서 사용해 보세요.
이처럼 MongoDB의 집계 프레임워크(Aggregation Framework)를 활용하면 SQL의 GROUP BY와 유사한 방식으로 데이터를 손쉽게 분석할 수 있습니다.