와일드카드 인덱스에 필드 포함 또는 제외하기
와일드카드 인덱스를 생성할 때 인덱스에 포함하거나 제외할 필드를 지정할 수 있습니다. 이를 통해 다음을 수행할 수 있습니다.
특정 필드만 포함하는 와일드카드 인덱스를 만듭니다. 예를 들어 하위 필드가 여러 개인 임베디드 문서가 여러 개 있는 경우 임베디드 문서와 그 하위 필드 모두에 대한 쿼리를 포괄하는 인덱스를 만들 수 있습니다.
특정 필드를 생략하는 와일드카드 인덱스를 만듭니다. 예를 들어, 쿼리되지 않는 필드가 포함된 컬렉션이 있는 경우 인덱스에서 해당 필드를 생략할 수 있습니다.
와일드카드 인덱스에 필드를 포함하거나 제외하려면 wildcardProjection
옵션에서 선택한 필드를 지정합니다.
db.<collection>.createIndex( { "$**" : <sortOrder> }, { "wildcardProjection" : { "<field1>" : < 0 | 1 >, "<field2>" : < 0 | 1 >, ... "<fieldN>" : < 0 | 1 > } } )
wildcardProjection
문서에서 0
또는 1
값은 필드가 인덱스에 포함되는지 또는 제외되는지 여부를 나타냅니다.
0
는 필드가 제외되었음을 의미합니다.1
필드가 포함되었음을 의미합니다.
제한 사항
wildcardProjection
옵션을 사용하려면 인덱스 키가$**
이어야 합니다.와일드카드 인덱스는
_id
필드를 명시적으로 포함하는 경우를 제외하고wildcardProjection
문서에서 포함 및 제외 성명서를 혼합하는 것을 지원하지 않습니다. 예를 들면 다음과 같습니다.다음
wildcardProjection
문서는 필드의 포함과 제외를 모두 지정하므로 유효하지 않습니다.{ "wildcardProjection" : { "attributes" : 0, "users" : 1 } } 다음
wildcardProjection
문서는 포함 및 제외를 모두 지정하지만 유효합니다. 이는_id
필드를 포함하고 있기 때문입니다.{ "wildcardProjection" : { "attributes" : 0, "_id" : 1 } }
시작하기 전에
products
컬렉션을 만들고 다음 문서를 포함합니다.
db.products.insertMany( [ { "item": "t-shirt", "price": "29.99", "attributes": { "material": "cotton", "color": "blue", "size": { "units": "cm", "length": 74 } } }, { "item": "milk", "price": "3.99", "attributes": { "sellBy": "02-06-2023", "type": "oat" } }, { "item": "laptop", "price": "339.99", "attributes": { "memory": "8GB", "size": { "units": "inches", "height": 10, "width": 15 } } } ] )
각 문서에는 제품 세부 정보가 포함된 attributes
필드가 있습니다. attributes
의 하위 필드는 제품에 따라 다릅니다.
절차
wildcardProjection
옵션을 사용하여 다음을 수행할 수 있습니다.
와일드카드 인덱스에 특정 필드 포함
특정 문서 필드를 자주 쿼리하는 경우 wildcardProjection
에서 해당 필드를 지정하여 인덱스에 불필요한 인덱스 팽창을 추가하지 않고도 해당 쿼리를 지원할 수 있습니다.
다음 작업은 attributes.size
및 attributes.color
필드의 모든 스칼라 값(문자열과 숫자를 의미)을 포함하는 와일드카드 인덱스를 생성합니다.
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.size" : 1, "attributes.color" : 1 } } )
결과
키 패턴 "$**"
은 문서의 모든 필드를 포함하지만 wildcardProjection
필드는 포함된 필드로만 인덱스를 제한합니다.
필드가 내장된 문서 또는 배열(예: attributes.size
)인 경우 와일드카드 인덱스는 필드로 재귀하여 내장된 모든 스칼라 필드 값을 인덱싱합니다.
생성된 인덱스는 wildcardProjection
개체에 포함된 모든 스칼라 값에 대한 쿼리를 지원합니다. 예를 들어 인덱스는 다음 쿼리를 지원합니다.
db.products.find( { "attributes.size.height" : 10 } ) db.products.find( { "attributes.color" : "blue" } )
인덱스는 다음 쿼리와 같이 wildcardProjection
에 포함되지 않은 필드에 대한 쿼리를 지원하지 않습니다 .
db.products.find ( { "item": "milk" } )
와일드카드 인덱스에서 특정 필드 제외하기
자주 쿼리하지 않는 문서 필드가 있다면 해당 필드를 생략하는 와일드카드 인덱스를 생성할 수 있습니다.
다음 작업은 products
collection의 모든 문서 필드에 와일드카드 인덱스를 생성하지만 attributes.memory
인덱스에서 필드를 생략합니다.
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.memory" : 0 } } )
결과
키 패턴 "$**"
은 문서의 모든 필드를 포함하지만 wildcardProjection
필드는 인덱스에서 attributes.memory
값을 제외합니다.
필드가 내장된 문서 또는 배열(예: attributes.size
)인 경우 와일드카드 인덱스는 필드로 재귀하여 내장된 모든 스칼라 필드 값을 인덱싱합니다.
예를 들어 인덱스는 다음 쿼리를 지원합니다.
db.products.find( { "attributes.color" : "blue" } ) db.products.find( { "attributes.size.height" : 10 } )
해당 필드가 인덱스에서 생략되었기 때문에 인덱스는 attributes.memory
에 대한 쿼리를 지원 하지 않습니다 .
자세히 알아보기
복합 와일드카드 인덱스와 함께 와일드카드 프로젝션을 사용하여 필드를 필터링하는 방법을 알아보려면 wildcardProjection
으로 필드 필터링을 참조하세요.
와일드카드 인덱스의 동작 및 사용 사례에 대해 자세히 알아보려면 다음을 참조하세요.