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

MongoDB 집계 파이프라인으로 최솟값·최댓값 구하기: $min과 $max 연산자 활용법

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의 집계 프레임워크를 활용하면 별도의 애플리케이션 로직 없이 데이터베이스 차원에서 효율적으로 통계 값을 도출할 수 있습니다.