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

MongoDB에서 중첩 인덱스(Nested Index) 생성하는 방법 완벽 가이드

MongoDB에서 문서 내부에 깊이 중첩된 필드(nested field)에도 인덱스를 생성할 수 있습니다. 이를 중첩 인덱스라고 하며, 점 표기법(dot notation)을 사용해 경로를 지정하면 됩니다. 인덱스 생성에는 createIndex() 메서드를 사용합니다.

중첩 인덱스 생성 기본 문법

db.yourCollectionName.createIndex({"외부필드명.내부필드명.두번째내부필드명": 1});

점(.)으로 필드 경로를 연결하고, 값 1은 오름차순(ascending) 인덱스를 의미합니다. 내림차순이 필요하면 -1을 사용하면 됩니다.

예제 컬렉션 준비하기

문법을 이해하기 위해 먼저 중첩 구조를 가진 문서 하나를 삽입해 보겠습니다.

> db.nestedIndexDemo.insertOne(
... {
...    "CustomerId": 101,
...    "CustomerDetails": {
...       "CustomerListDetails": {
...          "CustomerName": "Larry",
...          "CustomerProjectName": "Project-1",
...          "CustomerCountryName": "US"
...       }
...    }
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8fc565d3c9d04998abf010")
}

삽입된 문서 확인하기

find() 메서드로 컬렉션의 모든 문서를 조회할 수 있습니다.

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

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

{
   "_id" : ObjectId("5c8fc565d3c9d04998abf010"),
   "CustomerId" : 101,
   "CustomerDetails" : {
      "CustomerListDetails" : {
         "CustomerName" : "Larry",
         "CustomerProjectName" : "Project-1",
         "CustomerCountryName" : "US"
      }
   }
}

중첩 인덱스 실제 생성하기

이제 세 단계로 중첩된 CustomerCountryName 필드에 인덱스를 생성해 보겠습니다.

> db.nestedIndexDemo.createIndex({"CustomerDetails.CustomerListDetails.CustomerCountryName": 1});
{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

결과를 보면 인덱스가 1개에서 2개로 증가했습니다. 기본적으로 존재하는 _id 인덱스에 새로운 중첩 인덱스가 추가된 것입니다.

생성된 인덱스 목록 확인하기

getIndexes() 메서드로 현재 컬렉션의 모든 인덱스를 확인할 수 있습니다.

> db.nestedIndexDemo.getIndexes();

출력 결과는 다음과 같습니다.

[
   {
      "v" : 2,
      "key" : {
         "_id" : 1
      },
      "name" : "_id_",
      "ns" : "test.nestedIndexDemo"
   },
   {
      "v" : 2,
      "key" : {
         "CustomerDetails.CustomerListDetails.CustomerCountryName" : 1
      },
      "name" : "CustomerDetails.CustomerListDetails.CustomerCountryName_1",
      "ns" : "test.nestedIndexDemo"
   }
]

정리 및 참고 사항

  • MongoDB는 점 표기법을 통해 어떤 깊이의 중첩 필드든 인덱싱할 수 있습니다.
  • 인덱스 이름은 자동으로 필드경로_정렬순서 형태로 지정됩니다.
  • 인덱스가 많아지면 쓰기(write) 성능에 영향을 줄 수 있으므로, 실제 쿼리 패턴에 맞는 필드만 선택적으로 인덱싱하는 것이 좋습니다.
  • 생성된 인덱스는 해당 중첩 필드를 조건으로 사용하는 find() 쿼리의 검색 속도를 크게 향상시킵니다.