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()쿼리의 검색 속도를 크게 향상시킵니다.