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

MongoDB에서 고유 인덱스를 희소 고유 인덱스(Sparse Unique Index)로 변경하는 방법

MongoDB에서 희소 인덱스(sparse index)를 생성하려면 sparse: true 옵션을 사용합니다. 희소 고유 인덱스는 해당 필드가 존재하는 문서에만 고유성을 적용하기 때문에, 필드가 없는 문서까지 제한하지 않고 싶을 때 유용합니다.

이미 생성된 일반 고유 인덱스는 직접 수정할 수 없으므로, 기존 인덱스를 삭제(drop)한 후 희소 옵션을 추가하여 다시 생성해야 합니다. 아래에서 전체 과정을 단계별로 살펴보겠습니다.

1단계: 일반 고유 인덱스 생성

먼저 컬렉션에 일반 고유(unique) 인덱스를 생성합니다.

> db.demo229.ensureIndex({"ClientName":1}, {unique: true});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

참고로 ensureIndex()는 현재 더 이상 권장되지 않는(deprecated) 메서드입니다. 최신 MongoDB 버전에서는 동일한 역할을 하는 createIndex() 사용을 권장합니다.

2단계: 생성된 인덱스 확인

다음 쿼리로 현재 컬렉션의 인덱스 목록을 조회할 수 있습니다.

> db.demo229.getIndexes();

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

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.demo229"
    },
    {
        "v" : 2,
        "unique" : true,
        "key" : {
            "ClientName" : 1
        },
        "name" : "ClientName_1",
        "ns" : "test.demo229"
    }
]

출력 결과에서 ClientName_1 인덱스가 unique: true 속성만 가지고 있고, 아직 sparse 속성은 없는 것을 확인할 수 있습니다.

3단계: 기존 인덱스 삭제 후 희소 고유 인덱스로 재생성

인덱스 속성은 직접 변경할 수 없기 때문에, 먼저 dropIndex()로 기존 인덱스를 삭제한 뒤 sparse: true 옵션을 추가하여 새로 생성합니다.

> db.demo229.dropIndex("ClientName_1");
{ "nIndexesWas" : 2, "ok" : 1 }
> db.demo229.ensureIndex({"ClientName":1}, {unique: true, sparse:true});
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

createdCollectionAutomatically: false는 컬렉션이 이미 존재하기 때문에 새로 생성되지 않았음을 의미합니다.

4단계: 변경 결과 확인

다시 인덱스 목록을 조회하여 희소 옵션이 정상적으로 적용되었는지 확인합니다.

> db.demo229.getIndexes();

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

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.demo229"
    },
    {
        "v" : 2,
        "unique" : true,
        "key" : {
            "ClientName" : 1
        },
        "name" : "ClientName_1",
        "ns" : "test.demo229",
        "sparse" : true
    }
]

이제 ClientName_1 인덱스에 "sparse": true 속성이 추가된 것을 확인할 수 있습니다. 이렇게 하면 ClientName 필드가 존재하는 문서들 사이에서만 값의 고유성이 보장되며, 해당 필드가 없는 문서는 인덱스에서 제외됩니다.