Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 필드 이름을 모르는 상태로 하위 문서 쿼리 시 인덱스 활용 방법

인덱스를 활용한 하위 문서 쿼리

네, 가능합니다. 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) 인덱스를 적용하므로, 배열 요소 각각에 대한 검색 성능도 향상됩니다.