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개의 데이터를 추출할 수 있습니다.