MongoDB 배열 인덱싱의 원리
MongoDB는 배열 필드의 모든 값을 개별적으로 인덱싱하는 멀티키(Multikey) 인덱스 방식을 사용합니다. 덕분에 배열 전체가 아닌 특정 요소 하나만으로도 해당 문서를 빠르게 조회할 수 있습니다.
1단계: 예제 컬렉션 생성
개념을 이해하기 위해 먼저 배열 필드를 가진 문서로 컬렉션을 생성해 보겠습니다. 다음 쿼리를 실행합니다.
> db.indexingForArrayElementDemo.insertOne({"StudentFavouriteSubject":["MongoDB","MySQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8acdca6cea1f28b7aa0816")
}2단계: 저장된 문서 확인
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.indexingForArrayElementDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8acdca6cea1f28b7aa0816"),
"StudentFavouriteSubject" : [
"MongoDB",
"MySQL"
]
}3단계: 배열 필드에 인덱스 생성
아래 쿼리로 배열 필드에 인덱스를 생성합니다. 참고로 ensureIndex()는 현재 사용이 권장되지 않는(deprecated) 메서드이므로, 최신 버전의 MongoDB에서는 createIndex()를 사용하는 것이 좋습니다.
> db.indexingForArrayElementDemo.ensureIndex({"StudentFavouriteSubject":1});인덱스가 정상적으로 생성되면 다음과 같은 결과가 출력됩니다.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}4단계: 개별 배열 요소로 쿼리 실행
이제 생성된 인덱스를 활용하여 배열의 개별 요소를 조건으로 문서를 조회할 수 있습니다.
> db.indexingForArrayElementDemo.find({"StudentFavouriteSubject":"MongoDB"}).pretty();"MongoDB"를 조건으로 조회한 결과입니다.
{
"_id" : ObjectId("5c8acdca6cea1f28b7aa0816"),
"StudentFavouriteSubject" : [
"MongoDB",
"MySQL"
]
}같은 방식으로 "MySQL" 요소를 조건으로도 조회할 수 있습니다.
> db.indexingForArrayElementDemo.find({"StudentFavouriteSubject":"MySQL"}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8acdca6cea1f28b7aa0816"),
"StudentFavouriteSubject" : [
"MongoDB",
"MySQL"
]
}정리
MongoDB는 배열 필드에 인덱스를 생성하면 내부적으로 멀티키 인덱스를 구성하여 각 배열 요소마다 인덱스 항목을 만듭니다. 따라서 별도의 추가 설정 없이도 배열의 특정 요소를 조건으로 하는 쿼리를 인덱스를 통해 빠르게 처리할 수 있습니다.