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

MongoDB 중첩 필드에 인덱스 생성하는 방법

MongoDB에서 중첩(nested)된 필드에 인덱스를 생성하려면 점(.) 표기법을 사용하면 됩니다. 점 표기법은 상위 필드와 하위 필드를 마침표로 연결하여 내부에 위치한 필드까지 정확하게 지정할 수 있는 방식입니다.

1. 샘플 컬렉션 및 문서 생성

먼저 중첩된 구조를 가진 문서를 포함하는 컬렉션을 생성해 보겠습니다.

> db.createIndexOnNestedFieldDemo.insertOne(
    {"UserDetails":{"UserPersonalDetails":{"UserFirstName":"John","UserLastName":"Smith"}}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce929c778f00858fb12e916")
}
> db.createIndexOnNestedFieldDemo.insertOne({"UserDetails":{"UserPersonalDetails":{"UserFirstName":"Chris","UserLastName":"Brown"}}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce929d678f00858fb12e917")
}
> db.createIndexOnNestedFieldDemo.insertOne({"UserDetails":{"UserPersonalDetails":{"UserFirstName":"David","UserLastName":"Miller"}}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce929e378f00858fb12e918")
}

위 명령은 UserDetails.UserPersonalDetails라는 두 단계의 중첩 구조 안에 사용자 이름과 성을 저장하는 문서 세 개를 삽입합니다.

2. 저장된 문서 확인하기

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

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

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

{
    "_id" : ObjectId("5ce929c778f00858fb12e916"),
    "UserDetails" : {
        "UserPersonalDetails" : {
            "UserFirstName" : "John",
            "UserLastName" : "Smith"
        }
    }
}
{
    "_id" : ObjectId("5ce929d678f00858fb12e917"),
    "UserDetails" : {
        "UserPersonalDetails" : {
            "UserFirstName" : "Chris",
            "UserLastName" : "Brown"
        }
    }
}
{
    "_id" : ObjectId("5ce929e378f00858fb12e918"),
    "UserDetails" : {
        "UserPersonalDetails" : {
            "UserFirstName" : "David",
            "UserLastName" : "Miller"
        }
    }
}

3. 중첩 필드에 인덱스 생성하기

이제 점 표기법을 활용해 가장 깊은 수준에 있는 UserLastName 필드에 인덱스를 생성합니다.

> db.createIndexOnNestedFieldDemo.createIndex({"UserDetails.UserPersonalDetails.UserLastName":1});

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

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

결과 해석

출력 결과의 각 항목은 다음과 같은 의미를 가집니다.

createdCollectionAutomatically : false — 컬렉션이 이미 존재했기 때문에 자동 생성되지 않았음을 나타냅니다.
numIndexesBefore : 1 — 인덱스 생성 전에는 기본 _id 인덱스 하나만 존재했습니다.
numIndexesAfter : 2 — 새로운 인덱스가 추가되어 총 2개의 인덱스가 되었음을 의미합니다.
ok : 1 — 명령이 성공적으로 실행되었음을 나타냅니다.

이렇게 생성된 인덱스는 UserDetails.UserPersonalDetails.UserLastName 필드를 조건으로 사용하는 쿼리의 검색 속도를 크게 향상시켜 줍니다. 중첩 구조가 몇 단계로 이루어져 있더라도 점 표기법으로 경로를 정확히 지정하기만 하면 동일한 방식으로 인덱스를 만들 수 있습니다.