MongoDB에서 복합 다중 키 인덱스(compound multikey index)를 사용하려면 인덱스 생성 메서드를 활용하면 됩니다. 복합 다중 키 인덱스란 여러 필드를 조합해 인덱스를 만들되, 그중 하나 이상의 필드가 배열 타입인 경우를 의미합니다. 이러한 인덱스는 배열 내부의 하위 필드까지 효율적으로 검색할 수 있어 성능 최적화에 큰 도움이 됩니다.
참고로 ensureIndex()는 과거 버전의 메서드이며, 현재 MongoDB에서는 동일한 기능을 수행하는 createIndex() 사용이 권장됩니다.
1. 컬렉션에 복합 인덱스 생성하기
아래 예제에서는 id 필드와 배열 요소 내부의 details.userId 필드에 대해 오름차순(1) 복합 인덱스를 생성합니다:
> db.demo678.ensureIndex({id:1,"details.userId":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}실행 결과를 보면 컬렉션이 자동으로 생성되었고(createdCollectionAutomatically: true), 기본 _id 인덱스 외에 새로운 인덱스가 추가되어 총 2개의 인덱스가 된 것을 확인할 수 있습니다.
2. 배열 필드가 포함된 문서 삽입하기
이제 다중 키 인덱스의 대상이 되는 배열형 details 필드를 가진 문서를 삽입해 보겠습니다:
> db.demo678.insertOne(
... {
... id:101,
... "details" : [
... {
... "userId" : "1001",
... "userName":"Chris"
... },
... {
... "userId" : "1002",
... "userName":"David"
... }
... ],
... "otherDetails" : [
... {
... CountryName:"US",
... EmailId:["Chris@gmail.com","David@gmail.com"]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea4276904263e90dac943fc")
}
위 문서에는 details 배열 안에 두 개의 사용자 객체가 들어 있으며, 앞서 생성한 복합 인덱스는 각 배열 요소의 userId 값마다 인덱스 항목을 자동으로 유지합니다.
3. find() 메서드로 문서 조회하기
생성된 컬렉션의 모든 문서는 find() 메서드를 통해 확인할 수 있습니다:
> db.demo678.find();
위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다:
{ "_id" : ObjectId("5ea4276904263e90dac943fc"), "id" : 101, "details" : [
{ "userId" : "1001", "userName" : "Chris" },
{ "userId" : "1002", "userName" : "David" }
], "otherDetails" : [
{ "CountryName" : "US", "EmailId" : [ "Chris@gmail.com", "David@gmail.com" ] }
] }정리
이처럼 ensureIndex()(또는 최신 버전의 createIndex())를 사용하면 일반 필드와 배열 내부 필드를 조합한 복합 다중 키 인덱스를 손쉽게 만들 수 있습니다. 이후 id와 details.userId를 함께 조건으로 사용하는 쿼리는 해당 인덱스를 활용해 훨씬 빠르게 처리됩니다.