MongoDB에서 전체 배열에 대한 멀티키 인덱싱 구현하기
MongoDB에서 배열 필드를 대상으로 인덱스를 생성하면 자동으로 멀티키(multikey) 인덱스가 적용됩니다. 이번 글에서는 배열 형태의 문서를 가진 컬렉션을 만들고, 배열 전체에 대한 조회 및 인덱싱 동작을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 문서를 포함하는 컬렉션을 생성해 보겠습니다.
> db.demo277.insertOne({"details":[{"FirstName":"John"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48fb21dd099650a5401a52")
}
> db.demo277.insertOne({"details":[{"FirstName":"David"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48fb27dd099650a5401a53")
}
> db.demo277.insertOne({"details":[{"FirstName":"Chris"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48fb2bdd099650a5401a54")
}2. find() 메서드로 전체 문서 조회
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo277.find();
위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5e48fb21dd099650a5401a52"), "details" : [ { "FirstName" : "John" } ] }
{ "_id" : ObjectId("5e48fb27dd099650a5401a53"), "details" : [ { "FirstName" : "David" } ] }
{ "_id" : ObjectId("5e48fb2bdd099650a5401a54"), "details" : [ { "FirstName" : "Chris" } ] }3. 배열 전체에 대한 조회 쿼리 실행
다음은 배열 전체를 기준으로 조건을 지정해 문서를 조회하는 쿼리입니다. 이처럼 배열 전체에 대한 조건 검색은 멀티키 인덱싱과 연관되어 동작하며, 조건에 따라 전체 문서를 스캔할 수 있습니다.
> db.demo277.find({"details":{FirstName:"David"}});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e48fb27dd099650a5401a53"), "details" : [ { "FirstName" : "David" } ] }정리
MongoDB는 배열 필드에 인덱스를 걸면 각 배열 요소마다 별도의 인덱스 항목을 생성하는 멀티키 인덱스를 지원합니다. 다만 위 예제처럼 배열 전체를 정확히 일치(exact match)시키는 조건으로 조회할 경우, 의도한 대로 인덱스가 활용되지 않고 전체 문서 스캔이 발생할 수 있으므로 주의가 필요합니다. 성능 최적화를 위해서는 "details.FirstName"처럼 점 표기법(dot notation)으로 하위 필드를 직접 지정해 인덱스를 생성하고 조회하는 것이 권장됩니다.