MongoDB에서 컬렉션에 저장된 데이터 중 최솟값(min)과 최댓값(max)을 구해야 할 때는 집계(aggregation) 파이프라인에서 제공하는 $min과 $max 연산자를 사용하면 됩니다. 이 두 연산자는 주로 $group 단계와 함께 사용되어 전체 문서 또는 그룹별로 가장 작은 값과 가장 큰 값을 손쉽게 계산해 줍니다.
1. 샘플 컬렉션 생성하기
먼저 실습용 컬렉션을 만들고 점수(Marks) 데이터를 담은 문서를 삽입해 보겠습니다.
> db.demo251.insertOne({"Marks":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46c0001627c0c63e7dba74")
}
> db.demo251.insertOne({"Marks":87});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46c0031627c0c63e7dba75")
}
> db.demo251.insertOne({"Marks":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46c0061627c0c63e7dba76")
}
> db.demo251.insertOne({"Marks":76});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46c00c1627c0c63e7dba77")
}위 명령을 실행하면 총 4개의 문서가 demo251 컬렉션에 저장됩니다.
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo251.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e46c0001627c0c63e7dba74"), "Marks" : 78 }
{ "_id" : ObjectId("5e46c0031627c0c63e7dba75"), "Marks" : 87 }
{ "_id" : ObjectId("5e46c0061627c0c63e7dba76"), "Marks" : 56 }
{ "_id" : ObjectId("5e46c00c1627c0c63e7dba77"), "Marks" : 76 }3. 집계로 최솟값·최댓값 계산하기
이제 aggregate() 메서드와 $group, $min, $max 연산자를 조합하여 전체 문서에서 최고 점수와 최저 점수를 한 번에 구하는 쿼리를 작성해 보겠습니다.
> db.demo251.aggregate([
... { "$group": {
... "_id": null,
... "MaxMarks": { "$max": "$Marks" },
... "MinMarks": { "$min": "$Marks" }
... }}
...])여기서 _id: null로 지정하면 모든 문서가 하나의 그룹으로 묶이므로, 컬렉션 전체 기준의 최솟값과 최댓값을 얻을 수 있습니다. 실행 결과는 다음과 같습니다.
{ "_id" : null, "MaxMarks" : 87, "MinMarks" : 56 }정리
$max: 그룹 내 필드 값 중 가장 큰 값을 반환합니다.$min: 그룹 내 필드 값 중 가장 작은 값을 반환합니다._id: null을 사용하면 전체 문서를 하나의 그룹으로 처리하여 전체 기준 최솟값/최댓값을 구할 수 있습니다._id에 특정 필드(예: 과목명, 학생 이름)를 지정하면 그룹별 최솟값/최댓값도 손쉽게 계산할 수 있습니다.
이처럼 MongoDB의 집계 프레임워크를 활용하면 별도의 애플리케이션 로직 없이 데이터베이스 차원에서 효율적으로 통계 값을 도출할 수 있습니다.