Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 고유한 요소별 최대값 구하는 방법 ($sort와 $group 활용)

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 값별 최대값을 구하는 가장 일반적이고 효율적인 패턴입니다.