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

MongoDB에서 특정 필드의 최대 숫자 값 조회하기 – $not과 $type 연산자 활용 방법

MongoDB에서 최대 숫자 값을 찾는 방법

MongoDB에서 특정 필드의 가장 큰 숫자 값을 구하려면 $not 연산자$type 연산자를 함께 사용하는 것이 효과적입니다. 이 방법을 사용하면 문자열로 저장된 데이터를 제외하고 오직 숫자 타입의 데이터만 대상으로 최댓값을 조회할 수 있습니다.

실제 예제를 통해 단계별로 살펴보겠습니다.

1단계: 샘플 데이터가 있는 컬렉션 생성

먼저 insertOne() 메서드를 사용해 문서들을 담은 컬렉션을 생성합니다. 여기서는 학생 이름과 수학 점수를 저장하는 컬렉션을 만들어 보겠습니다.

> db.highestNumericValueOfAColumnDemo.insertOne(
...     {
...        "StudentName": "John",
...        "StudentMathMarks": 69
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cba05727219729fde21ddb1")
}
> db.highestNumericValueOfAColumnDemo.insertOne(
...     {
...        "StudentName": "Carol",
...        "StudentMathMarks": "89"
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cba059d7219729fde21ddb2")
}
> db.highestNumericValueOfAColumnDemo.insertOne(
...     {
...        "StudentName": "Chris",
...        "StudentMathMarks": 82
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cba059d7219729fde21ddb3")
}
> db.highestNumericValueOfAColumnDemo.insertOne(
...     {
...        "StudentName": "John",
...        "StudentMathMarks": "100"
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cba059d7219729fde21ddb4")
}

위 데이터에서 주목할 점은 점수가 일관되지 않다는 것입니다. John(69점)과 Chris(82점)의 점수는 숫자(number) 타입으로 저장된 반면, Carol("89")과 John("100")의 점수는 문자열(string) 타입으로 저장되어 있습니다.

2단계: 전체 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.

> db.highestNumericValueOfAColumnDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5cba05727219729fde21ddb1"),
    "StudentName" : "John",
    "StudentMathMarks" : 69
}
{
    "_id" : ObjectId("5cba059d7219729fde21ddb2"),
    "StudentName" : "Carol",
    "StudentMathMarks" : "89"
}
{
    "_id" : ObjectId("5cba059d7219729fde21ddb3"),
    "StudentName" : "Chris",
    "StudentMathMarks" : 82
}
{
    "_id" : ObjectId("5cba059d7219729fde21ddb4"),
    "StudentName" : "John",
    "StudentMathMarks" : "100"
}

3단계: 최대 숫자 값 조회 쿼리 실행

이제 핵심인 최댓값 조회 쿼리입니다. $type: 2는 BSON 타입 중 문자열(string)을 의미하며, $not 연산자와 결합하면 문자열이 아닌 문서, 즉 숫자 타입의 문서만 필터링됩니다.

> db.highestNumericValueOfAColumnDemo.find({StudentMathMarks: {$not: {$type: 2}}}).sort({StudentMathMarks: -1}).limit(1).pretty();

쿼리 실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5cba059d7219729fde21ddb3"),
    "StudentName" : "Chris",
    "StudentMathMarks" : 82
}

결과 분석

위 쿼리는 다음과 같은 방식으로 동작합니다.

  • $not + $type: 2 – 문자열 타입으로 저장된 값("89", "100")을 조회 대상에서 제외합니다.
  • sort({StudentMathMarks: -1}) – 남은 숫자 값들을 내림차순으로 정렬합니다.
  • limit(1) – 정렬된 결과 중 가장 앞에 있는 문서 하나, 즉 최댓값만 반환합니다.

그 결과 문자열로 저장된 "100"은 무시되고, 숫자 타입 값들(69, 82) 중 가장 큰 82가 Chris의 점수로 반환된 것을 확인할 수 있습니다.

참고로 MongoDB 3.2 이상에서는 $type: "string"처럼 타입 별칭(alias)을 직접 사용할 수도 있으며, 집계 파이프라인의 $max 연산자나 $type 집계 연산자를 활용하는 방법도 있습니다. 데이터 타입이 혼재된 컬렉션에서 정확한 숫자 비교가 필요할 때 위 방식을 유용하게 활용하시기 바랍니다.