와일드카드 인덱스 제한
이 페이지의 내용
이 페이지에서는 호환되지 않는 속성 및 지원되지 않는 쿼리 패턴과 같은 와일드카드 인덱스에 대한 제한 사항에 대해 설명합니다.
복합 와일드카드 인덱스 제한
복합 와일드카드 인덱스 에는 다음과 같은 제한 사항이 있습니다.
복합 와일드카드 인덱스에는 와일드카드 용어가 하나만 있을 수 있습니다.
예를 예시, 다음 인덱스 는 지정할 수 없습니다.
{ userID: 1, "object1.$**": 1, "object2.$**": 1 } compound wildcard index
에서 와일드카드가 아닌 텀은 단일 키 텀이어야 합니다. 멀티키 인덱스 텀은 허용되지 않습니다.wildcardProjection
옵션은 와일드카드 필드 가$**
인 경우에만 유효합니다. 와일드카드 인덱스 텀 의 필드 경로 를 지정할 때는wildcardProjection
를 사용할 수 없습니다.유효한 정의입니다.
{ key: { "$**": 1 }, name: "index_all_with_projection", wildcardProjection: { "someFields.name": 1, "otherFields.values": 1 } } 이는 잘못된 정의입니다:
{ key: { "someFields.$**": 1 }, name: "invalid_index", wildcardProjection: { "someFields.name": 1, "otherFields.values": 1 } } _id
필드는 기본적으로 생략됩니다._id
필드가 필요한 경우:와일드카드 인덱스를 다음과 같이 지정합니다.
$**
다음을 사용하세요.
wildcardProjection
_id
필드 지정
db.studentGrades.createIndex( { "$**": 1, }, { wildcardProjection: { _id: 1, exams: 1, extraCredit: 1 } } ) 와일드카드 필드와 일반 필드에 동일한 필드 를 포함할 수 없습니다.
wildcardProjection
를 사용하여 와일드카드 패턴 에서 필드를 제외할 수 있습니다.db.studentGrades.createIndex( { exams: 1, "$**": 1, homeworks: 1 }, { wildcardProjection: { exams: 0, homeworks: 0 } } )
호환되지 않는 인덱스 속성
와일드카드 인덱스에는 다음 속성을 지정할 수 없습니다.
호환되지 않는 인덱스 유형
와일드카드 구문($.**
)을 사용하여 다음 인덱스 유형을 생성할 수 없습니다.
참고
명확화
와일드카드 인덱스 는 자체 관리 배포서버에서 와일드카드 텍스트 인덱스 생성 과 구별되며 와 호환되지 않습니다. 와일드카드 인덱스는 $text
연산자 를 사용하는 쿼리를 지원 수 없습니다.
샤드 키
와일드카드 인덱스 는 샤드 키 인덱스 로 사용할 수 없습니다.
지원되지 않는 쿼리 패턴
와일드카드 인덱스는 다음 쿼리 패턴을 지원 수 없습니다.
배열 필드가 다음과 같지 않음 null
지정된 필드가 컬렉션 내 문서의 배열인 경우 와일드카드 인덱스는 해당 필드가 null
와(과) 같지 않은 문서에 대한 쿼리를 지원할 수 없습니다.
예를 들어 product_attributes
에 와일드카드 인덱스가 있는 inventory
컬렉션을 생각해 보겠습니다. 컬렉션의 문서에 product_attributes.tags
가 배열인 경우 와일드카드 인덱스는 다음 쿼리를 지원할 수 없습니다 .
db.inventory.find( { $ne : [ "product_attributes.tags", null ] } ) db.inventory.aggregate( [ { $match : { $ne : [ "product_attributes.tags", null ] } } ] )
문서 및 배열의 동등성 매치
와일드카드 인덱스는 문서 나 배열 자체가 아닌 문서 나 배열 의 내용에 대한 항목을 저장 합니다. 따라서 와일드카드 인덱스는 문서나 배열에서 정확한 동등성 매치를 지원 수 없습니다.
예를 예시 product_attributes
에 와일드카드 인덱스 가 있는 inventory
컬렉션 을 생각해 보겠습니다. 와일드카드 인덱스 는 다음 쿼리를 지원 수 없습니다.
db.inventory.find( { "product_attributes" : { "price" : 29.99 } } ) db.inventory.find( { "product_attributes.tags" : [ "waterproof", "fireproof" ] } )
참고
와일드카드 인덱스는 필드가 빈 문서 {}
인 쿼리를 지원할 수 있습니다 .
마찬가지로 와일드카드 인덱스는 문서와 배열에서 정확한 부등식 일치를 지원할 수 없습니다. 예를 들어 product_attributes
의 와일드카드 인덱스는 다음 쿼리를 지원할 수 없습니다.
db.inventory.aggregate( [ { $match : { $ne : [ "product_attributes", { "price" : 29.99 } ] } } ] ) db.inventory.aggregate( [ { $match : { $ne : [ "product_attributes.tags", [ "waterproof", "fireproof" ] ] } } ] )
필드가 존재하지 않음
와일드카드 인덱스는 희박 하며 빈 필드를 인덱스 하지 않습니다. 따라서 와일드카드 인덱스는 필드 가 존재하지 않는 문서에 대한 쿼리를 지원 수 없습니다.
예를 예시 product_attributes
에 와일드카드 인덱스 가 있는 inventory
컬렉션 을 생각해 보겠습니다. 와일드카드 인덱스 는 다음 쿼리를 지원 수 없습니다.
db.inventory.find( { "product_attributes" : { $exists : false } } ) db.inventory.aggregate( [ { $match : { "product_attributes" : { $exists : false } } } ] )
다중 필드 쿼리 조건자
와일드카드 인덱스는 최대 하나 의 쿼리 조건자 필드를 지원할 수 있습니다. 이는 다음을 의미합니다.
MongoDB 는 쿼리 조건자의 한 부분을 지원 하기 위해 와일드카드가 아닌 인덱스 를 사용하고 다른 부분을 지원 하기 위해 와일드카드 인덱스 를 사용할 수 없습니다.
MongoDB는 동일한 쿼리에서 서로 다른 술어를 지원하기 위해 여러 와일드카드 인덱스를 사용할 수 없습니다.
단일 와일드카드 인덱스 가 여러 쿼리 필드를 지원 수 있는 경우, MongoDB 는 쿼리 필드 중 하나를 지원 하는 데 와일드카드 인덱스 만 사용할 수 있습니다. MongoDB 는 관련 와일드카드 인덱스 경로를 기반으로 와일드카드 인덱스 로 지원 필드 를 자동으로 선택합니다.
예를 예시 product_attributes
에 와일드카드 인덱스 가 있는 inventory
컬렉션 을 생각해 보겠습니다. 와일드카드 인덱스 는 다음 쿼리 의 모든 조건자를 지원 수 없습니다.
db.inventory.find( { "product_attributes.price": { $gt: 20 }, "product_attributes.material": "silk", "product_attributes.size": "large" } )
대신 MongoDB 는 와일드카드 인덱스 를 사용하여 쿼리 조건자 중 하나만 지원 합니다. MongoDB 는 관련 와일드카드 인덱스 경로를 기반으로 지원 조건자를 선택합니다. 지원되지 않는 쿼리 조건자는 설명 rejectedPlans
결과 의 에 표시됩니다.
정렬을 사용한 쿼리
MongoDB는 다음 사항이 모두 참인 경우에만 를 충족하기 위해 와일드카드 인덱스를 사용할 수 있습니다. sort()
쿼리 플래너는 쿼리 조건자를 충족하기 위해 와일드카드 인덱스를 선택합니다.
sort()
는 쿼리 조건자 필드 만 지정합니다.지정된 필드는 배열이 아닙니다.
위의 조건이 충족되지 않으면 MongoDB 는 정렬에 와일드카드 인덱스 를 사용할 수 없습니다. MongoDB 는 쿼리 술어의 인덱스와 다른 인덱스 가 필요한 sort()
작업을 지원 하지 않습니다.
products
collection에 다음과 같은 와일드카드 인덱스가 있다고 가정해 봅시다.
db.products.createIndex( { "product_attributes.$**" : 1 } )
다음 작업은 단일 필드 product_attributes.price
를 쿼리하고 동일한 필드를 정렬합니다.
db.products.find( { "product_attributes.price" : { $gt : 10.00 } }, ).sort( { "product_attributes.price" : 1 } )
지정된 price
가 배열이 아니라고 가정하면 MongoDB는 product_attributes.$**
와일드카드 인덱스를 사용하여 find()
및 sort()
을 모두 충족할 수 있습니다.