인덱스를 활용한 하위 문서 쿼리
네, 가능합니다. MongoDB에서는 키(key)에는 "properties.k", 값(value)에는 "properties.v"와 같은 형식으로 인덱스를 생성하면, 필드 이름을 미리 알지 못하는 하위 문서(subdocument)도 인덱스를 활용하여 조회할 수 있습니다. 과거에는 ensureIndex() 메서드를 사용해 이러한 인덱스를 생성했습니다.
먼저 예제를 통해 문서가 포함된 컬렉션을 만들어 보겠습니다.
> db.demo274.insertOne({"details":[{StudentFirstName:"Chris",StudentLastName:"Brown"},
... {StudentFirstName:"David",StudentLastName:"Miller"},
... {StudentFirstName:"John",StudentLastName:"Smith"},
... {StudentFirstName:"John",StudentLastName:"Doe"}
...]
...}
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48de35dd099650a5401a42")
}find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo274.find().pretty();
출력 결과
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e48de35dd099650a5401a42"),
"details" : [
{
"StudentFirstName" : "Chris",
"StudentLastName" : "Brown"
},
{
"StudentFirstName" : "David",
"StudentLastName" : "Miller"
},
{
"StudentFirstName" : "John",
"StudentLastName" : "Smith"
},
{
"StudentFirstName" : "John",
"StudentLastName" : "Doe"
}
]
}다음은 필드 이름을 알 수 없는 MongoDB 하위 문서를 쿼리할 때 인덱스를 활용하기 위한 쿼리입니다.
> db.demo274.ensureIndex({"details.StudentFirstName": 1, "details.StudentLastName": 1});출력 결과
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}참고 사항
ensureIndex()는 현재 더 이상 권장되지 않는(deprecated) 메서드입니다. MongoDB 3.0 이상 버전에서는 동일한 기능을 수행하는 createIndex() 메서드를 사용하는 것이 좋습니다.
> db.demo274.createIndex({"details.StudentFirstName": 1, "details.StudentLastName": 1});위와 같이 복합 인덱스(compound index)를 생성하면 이름과 성 두 필드를 함께 검색하는 쿼리에서 인덱스를 효율적으로 활용할 수 있습니다. 또한 배열 내부의 하위 문서 필드에 대해서는 MongoDB가 자동으로 멀티키(multikey) 인덱스를 적용하므로, 배열 요소 각각에 대한 검색 성능도 향상됩니다.