MongoDB에서 고유한(distinct) 요소별로 최대값을 구하려면 aggregate() 메서드 안에서 $sort와 $group 스테이지를 함께 사용하면 됩니다. 핵심 아이디어는 값 기준으로 내림차순 정렬한 뒤 그룹화하여 각 그룹의 첫 번째 문서(즉, 가장 큰 값을 가진 문서)를 선택하는 것입니다.
1. 샘플 컬렉션 생성하기
먼저 문서를 담은 컬렉션을 생성합니다.
> db.demo750.insertOne({id:101,value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae74b2a930c785c834e566")
}
> db.demo750.insertOne({id:102,value:40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae74c8a930c785c834e567")
}
> db.demo750.insertOne({id:101,value:110});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae74dba930c785c834e568")
}위 예제에서는 id가 101인 문서가 두 개 존재하며, 각각 value가 50과 110입니다. 이 중 최대값인 110만 추출하는 것이 목표입니다.
2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo750.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5eae74b2a930c785c834e566"), "id" : 101, "value" : 50 }
{ "_id" : ObjectId("5eae74c8a930c785c834e567"), "id" : 102, "value" : 40 }
{ "_id" : ObjectId("5eae74dba930c785c834e568"), "id" : 101, "value" : 110 }3. 고유한 요소별 최대값 조회 쿼리
다음은 MongoDB에서 고유한 요소(id)별로 value의 최대값을 구하는 집계 쿼리입니다.
> db.demo750.aggregate([
... {
... $sort: { value: -1 }
... },
... {
... $group: {
... _id: "$id",
... value: { $first: "$value" }
... }
... },
... {
... $project: {
... id: "$_id",
... value: 1
... }
... }
... ])쿼리 동작 원리
- $sort: { value: -1 } — value를 내림차순으로 정렬하여, 각 id 그룹에서 가장 큰 값이 앞쪽에 오도록 만듭니다.
- $group — id 필드를 기준으로 문서를 그룹화하고,
$first연산자로 정렬된 순서상 첫 번째 값(= 최대값)을 가져옵니다. - $project — 출력 형태를 다듬어
_id대신id라는 이름으로 결과를 보여줍니다.
실행 결과는 다음과 같습니다.
{ "_id" : 102, "value" : 40, "id" : 102 }
{ "_id" : 101, "value" : 110, "id" : 101 }결과를 보면 id 101에 대해서는 두 개의 값(50, 110) 중 최대값인 110만 반환된 것을 확인할 수 있습니다. 이처럼 $sort → $group($first) 조합은 MongoDB에서 distinct 값별 최대값을 구하는 가장 일반적이고 효율적인 패턴입니다.