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

MongoDB 집계(Aggregation)로 최저 점수 문서 2개 조회하기

MongoDB에서 점수(Marks)가 가장 낮은 두 개의 문서를 조회하려면 집계 파이프라인의 여러 단계를 조합하면 됩니다. 먼저 $group으로 점수별로 데이터를 묶고, $sort로 오름차순 정렬한 뒤, $limit: 2를 사용해 최솟값을 가진 두 개의 문서만 출력할 수 있습니다.

1. 샘플 컬렉션 생성

예제 실습을 위해 다음과 같이 문서를 포함한 컬렉션을 생성합니다.

> db.demo709.insertOne({Name:"John","Marks":75});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea839005d33e20ed1097b76")
}
> db.demo709.insertOne({Name:"Chris","Marks":45});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea839075d33e20ed1097b77")
}
> db.demo709.insertOne({Name:"David","Marks":54});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea839125d33e20ed1097b78")
}
> db.demo709.insertOne({Name:"Bob","Marks":69});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea839295d33e20ed1097b79")
}

2. 전체 문서 확인

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.demo709.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5ea839005d33e20ed1097b76"), "Name" : "John", "Marks" : 75 }
{ "_id" : ObjectId("5ea839075d33e20ed1097b77"), "Name" : "Chris", "Marks" : 45 }
{ "_id" : ObjectId("5ea839125d33e20ed1097b78"), "Name" : "David", "Marks" : 54 }
{ "_id" : ObjectId("5ea839295d33e20ed1097b79"), "Name" : "Bob", "Marks" : 69 }

3. 최저 점수 문서 2개를 조회하는 집계 쿼리

이제 세 단계로 구성된 집계 파이프라인을 실행해 보겠습니다.

  • $group: 점수($Marks)를 기준으로 그룹화하고, 같은 점수를 가진 이름들을 $push로 배열에 저장합니다.
  • $sort: 그룹화된 점수(_id)를 오름차순(1)으로 정렬합니다.
  • $limit: 정렬된 결과 중 상위 2개 문서만 가져옵니다.
> db.demo709.aggregate({
...     $group: {
...        _id: '$Marks',
...        ListOfName: { $push: '$Name' }
...     }
... }, {
...     $sort: {
...        '_id': 1
...     }
... }, {
...     $limit: 2
... });

4. 실행 결과

쿼리를 실행하면 점수가 가장 낮은 두 개의 문서가 다음과 같이 출력됩니다.

{ "_id" : 45, "ListOfName" : [ "Chris" ] }
{ "_id" : 54, "ListOfName" : [ "David" ] }

결과를 보면 최저 점수 45점을 받은 Chris와 두 번째로 낮은 54점을 받은 David이 순서대로 반환되었습니다. 이처럼 $group, $sort, $limit을 조합하면 MongoDB에서 손쉽게 최솟값 기준 상위 N개의 데이터를 추출할 수 있습니다.