문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ / /

와일드카드 인덱스에 필드 포함 또는 제외하기

이 페이지의 내용

  • 제한 사항
  • 시작하기 전에
  • 절차
  • 와일드카드 인덱스에 특정 필드 포함
  • 와일드카드 인덱스에서 특정 필드 제외하기
  • 자세히 알아보기

와일드카드 인덱스를 생성할 때 인덱스에 포함하거나 제외할 필드를 지정할 수 있습니다. 이를 통해 다음을 수행할 수 있습니다.

  • 특정 필드만 포함하는 와일드카드 인덱스를 만듭니다. 예를 들어 하위 필드가 여러 개인 임베디드 문서가 여러 개 있는 경우 임베디드 문서와 그 하위 필드 모두에 대한 쿼리를 포괄하는 인덱스를 만들 수 있습니다.

  • 특정 필드를 생략하는 와일드카드 인덱스를 만듭니다. 예를 들어, 쿼리되지 않는 필드가 포함된 컬렉션이 있는 경우 인덱스에서 해당 필드를 생략할 수 있습니다.

와일드카드 인덱스에 필드를 포함하거나 제외하려면 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.sizeattributes.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 으로 필드 필터링을 참조하세요.

와일드카드 인덱스의 동작 및 사용 사례에 대해 자세히 알아보려면 다음을 참조하세요.

← 단일 필드에 와일드카드 인덱스 만들기