이 페이지에서는 호환되지 않는 속성 및 지원되지 않는 쿼리 패턴과 같은 와일드카드 인덱스에 대한 제한 사항에 대해 설명합니다.
복합 와일드카드 인덱스 제한
복합 와일드카드 인덱스 에는 다음과 같은 제한 사항이 있습니다.
복합 와일드카드 인덱스에는 와일드카드 용어가 하나만 있을 수 있습니다.
예를 예시, 다음 인덱스 는 지정할 수 없습니다.
{ 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 쿼리 필드 중 하나를 지원 데 와일드카드 인덱스 만 사용할 수 있습니다.
예를 예시 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() 을 모두 충족할 수 있습니다.