와일드카드 인덱스 를 만들 때 인덱스 에 포함하거나 제외할 필드를 지정할 수 있습니다. 이를 통해 다음을 수행할 수 있습니다.
특정 필드만 포함하는 와일드카드 인덱스를 만듭니다. 예를 들어 하위 필드가 여러 개인 임베디드 문서가 여러 개 있는 경우 임베디드 문서와 그 하위 필드 모두에 대한 쿼리를 포괄하는 인덱스를 만들 수 있습니다.
특정 필드를 생략하는 와일드카드 인덱스를 만듭니다. 예를 들어, 쿼리되지 않는 필드가 포함된 컬렉션이 있는 경우 인덱스에서 해당 필드를 생략할 수 있습니다.
와일드카드 인덱스에 필드를 포함하거나 제외하려면 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 객체 에 포함된 필드에 대한 쿼리만 지원합니다. 이 예시 에서 MongoDB 는 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 으로 필드 필터링을 참조하세요.
와일드카드 인덱스의 동작 및 사용 사례에 학습 보려면 다음을 참조하세요.