MongoDB 내부 항목 인덱싱으로 값 가져오기
MongoDB에서는 도트 표기법(dot notation)을 활용해 내장 문서(서브 도큐먼트)의 특정 필드에 인덱스를 생성할 수 있습니다. 인덱스를 미리 만들어 두면 조건에 맞는 데이터를 훨씬 빠르게 조회할 수 있습니다. 아래 예제를 통해 전체 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 인덱스 만들기
먼저 insertOne() 메서드로 문서를 삽입해 demo323 컬렉션을 생성한 뒤, ensureIndex()를 사용하여 details.Name 필드에 오름차순(1) 인덱스를 생성합니다.
> db.demo323.insertOne({"details":{"Name":"Chris","Age":34}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e51157af8647eb59e56206e")
}
> db.demo323.insertOne({"details":{"Name":"David","Age":31}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e511581f8647eb59e56206f")
}
> db.demo323.insertOne({"details":{"Name":"Bob","Age":28}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e511589f8647eb59e562070")
}
> db.demo323.ensureIndex({"details.Name":1});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}2단계: find() 메서드로 전체 문서 확인
find() 메서드를 호출하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo323.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e51157af8647eb59e56206e"), "details" : { "Name" : "Chris", "Age" : 34 } }
{ "_id" : ObjectId("5e511581f8647eb59e56206f"), "details" : { "Name" : "David", "Age" : 31 } }
{ "_id" : ObjectId("5e511589f8647eb59e562070"), "details" : { "Name" : "Bob", "Age" : 28 } }3단계: 인덱싱된 필드로 값 조회하기
다음은 details.Name 값이 Bob인 문서만 조회하는 쿼리입니다. 앞서 생성한 인덱스 덕분에 이 검색은 전체 컬렉션을 스캔하지 않고도 효율적으로 처리됩니다.
> db.demo323.find({"details.Name":"Bob"});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e511589f8647eb59e562070"), "details" : { "Name" : "Bob", "Age" : 28 } }마무리 정리
이처럼 MongoDB에서는 details.Name처럼 도트 표기법으로 서브 도큐먼트의 내부 필드에 인덱스를 생성할 수 있으며, find() 쿼리에서 해당 필드를 조건으로 지정하면 인덱스를 활용한 빠른 조회가 가능합니다. 참고로 ensureIndex()는 현재 deprecated 상태이므로, 최신 MongoDB 버전에서는 동일한 기능을 제공하는 createIndex()를 사용하는 것이 좋습니다.