MongoDB에서 열(필드)의 최댓값 구하기
MongoDB에서 특정 컬렉션의 한 필드(column)에 대한 가장 큰 값을 조회하려면 sort() 메서드와 limit(1) 메서드를 함께 사용하면 됩니다. 해당 필드를 기준으로 내림차순 정렬한 뒤 첫 번째 문서만 가져오는 방식입니다.
기본 문법
db.yourCollectionName.find().sort({"yourFieldName":-1}).limit(1);sort({"yourFieldName": -1})은 지정한 필드를 내림차순(-1)으로 정렬하고, limit(1)은 정렬된 결과 중 첫 번째 문서 하나만 반환합니다. 즉, 가장 큰 값을 가진 문서가 결과로 나오게 됩니다.
예제 컬렉션 생성
문법을 실제로 이해하기 위해 샘플 컬렉션을 만들고 문서를 삽입해 보겠습니다. 아래 쿼리는 gettingHighestValueDemo라는 컬렉션에 여러 개의 숫자 값을 가진 문서를 차례로 추가합니다.
> db.gettingHighestValueDemo.insertOne({"Value":1029});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900b885705caea966c5574")
}
> db.gettingHighestValueDemo.insertOne({"Value":3029});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900b8d5705caea966c5575")
}
> db.gettingHighestValueDemo.insertOne({"Value":1092});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900b925705caea966c5576")
}
> db.gettingHighestValueDemo.insertOne({"Value":18484});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900b955705caea966c5577")
}
> db.gettingHighestValueDemo.insertOne({"Value":37474});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900b9c5705caea966c5578")
}
> db.gettingHighestValueDemo.insertOne({"Value":88474});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900ba75705caea966c5579")
}
> db.gettingHighestValueDemo.insertOne({"Value":1938474});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c900bab5705caea966c557a")
}저장된 전체 문서 확인
find() 메서드와 pretty() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.gettingHighestValueDemo.find().pretty();
위 쿼리의 실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c900b885705caea966c5574"), "Value" : 1029 }
{ "_id" : ObjectId("5c900b8d5705caea966c5575"), "Value" : 3029 }
{ "_id" : ObjectId("5c900b925705caea966c5576"), "Value" : 1092 }
{ "_id" : ObjectId("5c900b955705caea966c5577"), "Value" : 18484 }
{ "_id" : ObjectId("5c900b9c5705caea966c5578"), "Value" : 37474 }
{ "_id" : ObjectId("5c900ba75705caea966c5579"), "Value" : 88474 }
{ "_id" : ObjectId("5c900bab5705caea966c557a"), "Value" : 1938474 }최댓값 조회 쿼리 실행
이제 sort()와 limit(1)을 조합하여 Value 필드의 최댓값을 가진 문서를 조회해 보겠습니다.
> db.gettingHighestValueDemo.find().sort({"Value":-1}).limit(1);실행 결과, 다음과 같이 가장 큰 값인 1938474를 가진 문서가 반환됩니다.
{ "_id" : ObjectId("5c900bab5705caea966c557a"), "Value" : 1938474 }참고: 대량 데이터에서의 성능 최적화
컬렉션의 문서 수가 많다면 조회 성능을 위해 해당 필드에 인덱스를 생성하는 것이 좋습니다. 인덱스가 있으면 MongoDB가 전체 문서를 스캔하지 않고도 정렬된 순서를 바로 활용할 수 있어 최댓값 조회 속도가 크게 향상됩니다.
> db.gettingHighestValueDemo.createIndex({"Value":-1});이처럼 sort() + limit(1) 조합은 SQL의 MAX() 함수에 해당하는 결과를 MongoDB에서 간단하게 얻을 수 있는 표준적인 방법입니다.