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

MongoDB에서 null 값도 인덱싱할 수 있을까요?

MongoDB는 null 값을 인덱싱할 수 있습니다

네, MongoDB는 null 값도 손쉽게 인덱싱할 수 있습니다. MongoDB의 인덱스는 다양한 BSON 타입의 값을 처리하며, null 역시 하나의 유효한 값으로 간주되어 인덱스에 포함됩니다.

이번 글에서는 실제 예제를 통해 null 값이 포함된 필드에 고유(unique) 인덱스를 생성하고, 해당 인덱스가 정상적으로 동작하는지 확인해 보겠습니다.

1단계: 컬렉션 생성 및 고유 인덱스 만들기

먼저 createIndex() 메서드를 사용해 Value 필드에 고유 인덱스를 생성합니다.

> db.demo170.createIndex({"Value":1},{unique:true});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

인덱스가 성공적으로 생성되었으며, 컬렉션이 자동으로 만들어진 것을 확인할 수 있습니다.

2단계: null 값을 포함한 문서 삽입하기

이제 숫자 값과 함께 null 값을 가진 문서를 여러 개 삽입해 보겠습니다.

> db.demo170.insert({"Value":100});
WriteResult({ "nInserted" : 1 })
> db.demo170.insert({"Value":null});
WriteResult({ "nInserted" : 1 })
> db.demo170.insert({"Value":90});
WriteResult({ "nInserted" : 1 })
> db.demo170.insert({"Value":78});
WriteResult({ "nInserted" : 1 })

고유 인덱스가 설정된 상태에서도 null 값이 정상적으로 삽입된 점에 주목하세요. MongoDB에서는 null도 하나의 고유한 값으로 취급되기 때문입니다.

3단계: find() 메서드로 전체 문서 조회하기

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

> db.demo170.find();

위 쿼리는 다음과 같은 결과를 반환합니다.

{ "_id" : ObjectId("5e369b789e4f06af551997da"), "Value" : 100 }
{ "_id" : ObjectId("5e369b7c9e4f06af551997db"), "Value" : null }
{ "_id" : ObjectId("5e369b809e4f06af551997dc"), "Value" : 90 }
{ "_id" : ObjectId("5e369b969e4f06af551997dd"), "Value" : 78 }

4단계: 정렬을 통해 null 인덱싱 확인하기

다음 쿼리는 Value 필드를 기준으로 오름차순 정렬을 수행하며, 이 과정에서 생성된 인덱스가 활용됩니다.

> db.demo170.find().sort({Value:1});

정렬 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e369b7c9e4f06af551997db"), "Value" : null }
{ "_id" : ObjectId("5e369b969e4f06af551997dd"), "Value" : 78 }
{ "_id" : ObjectId("5e369b809e4f06af551997dc"), "Value" : 90 }
{ "_id" : ObjectId("5e369b789e4f06af551997da"), "Value" : 100 }

정리

결과를 보면 null 값이 가장 앞쪽에 정렬된 것을 확인할 수 있습니다. 이는 MongoDB가 BSON 타입의 정렬 순서에 따라 null을 숫자보다 작은 값으로 취급하기 때문입니다.

핵심 내용을 요약하면 다음과 같습니다.

  • MongoDB는 null 값을 일반적인 값처럼 인덱스에 저장할 수 있습니다.
  • 고유(unique) 인덱스가 있어도 null 값은 하나만 존재하면 삽입이 가능합니다. 단, null이 두 개 이상이면 중복 오류가 발생합니다.
  • 정렬 시 null은 기본적으로 숫자나 문자열보다 앞에 위치합니다.

따라서 필드에 null이 자주 사용되는 스키마라면, 인덱스 설계 시 null 값의 동작 방식을 반드시 고려하는 것이 좋습니다.