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

복합 와일드카드 인덱스

이 페이지의 내용

  • 사용 사례
  • 속성 패턴을 사용하여 검색
  • 행동
  • 와일드카드 인덱스에 대한 일반 고려 사항
  • 복합 와일드카드 인덱스 고려 사항
  • 시작하기
  • 필드 필터링 wildcardProjection
  • 헬퍼 메서드를 사용하여 와일드카드 인덱스 만들기
  • 자세히 알아보기

버전 7.0에 추가.

MongoDB는 필드 또는 필드 세트에 와일드카드 인덱스 생성을 지원합니다. 복합 인덱스에는 여러 인덱스 텀이 있습니다. 복합 와일드카드 인덱스에는 하나의 와일드카드 텀과 하나 이상의 추가 인덱스 텀이 있습니다.

중요

와일드카드 인덱스는 워크로드 기반 인덱스 계획을 대체하지 않습니다.

워크로드를 지원하는 인덱스 만들기에 대한 자세한 내용은 쿼리를 지원하는 인덱스 만들기를 참조하세요.

속성 패턴 은 공통된 특성을 공유하는 문서를 검색할 때 유용한 기술입니다.

안타깝게도 가능한 모든 쿼리를 포함하기 위해 많은 개별 인덱스를 생성하는 것은 비용이 많이 듭니다. 하나의 와일드카드 인덱스가 많은 잠재적 쿼리를 효율적으로 처리할 수 있으므로 와일드카드 인덱스는 많은 수의 개별 인덱스를 생성하는 것보다 좋은 대안입니다.

다음과 같은 스키마를 가정해 보겠습니다.

{
tenantId: <Number>,
tenantRegion: <Number>,
customFields: {
addr: <String>,
name: <String>,
blockId: <Number>,
...
}
dateOpened: <Date>
}

특정 tenantId 가 있는 테넌트에 대해 customFields 필드의 측면을 쿼리할 수 있습니다. 다음과 같이 일련의 개별 인덱스를 만들 수 있습니다.

{ tenantId: 1, “customFields.addr": 1 }
{ tenantId: 1, “customFields.name": 1 }
{ tenantId: 1, “customFields.blockId": 1 }
...

이 접근 방식은 유지 관리가 어렵으며 컬렉션당 최대 인덱스 수(64개)에 도달할 가능성이 높습니다.

대신 복합 와일드카드 인덱스를 사용하세요. 복합 와일드카드 인덱스는 작성하기 쉽고 유지 관리가 더 쉽으며 64개 인덱스 collection 제한에 도달할 가능성이 낮습니다.

이 예에서는 salesData 컬렉션에 복합 와일드카드 인덱스를 만듭니다.

db.runCommand(
{
createIndexes: "salesData",
indexes: [
{
key: {
tenantId: 1,
"customFields.$**": 1
},
name: "tenant_customFields"
}
]
}
)

와일드카드 "customFields.$**"customFields 필드의 모든 하위 필드를 지정합니다. 다른 인덱스 텀인 tenantId 는 와일드카드 사양이 아닙니다. 이는 표준 필드 사양입니다.

와일드카드 인덱스를 생성하려면 표준 인덱스 생성 명령을 사용합니다.

  • 와일드카드 인덱스는 기본적으로 _id 필드를 생략합니다. 와일드카드 인덱스에 _id 필드를 포함하려면 해당 필드를 wildcardProjection 문서에 명시적으로 포함해야 합니다.

    db.salesData.createIndex(
    { "$**" : 1 },
    { "wildcardProjection" :
    { "_id": 1, "customers.lastName": 1, "customers.FirstName": 1, }
    }
    )
  • collection에 와일드카드 인덱스를 두 개 이상 만들 수 있습니다.

  • 와일드카드 인덱스는 collection의 다른 인덱스와 동일한 필드를 포함할 수 있습니다.

  • 와일드카드 인덱스는 희박 합니다. 여기에는 인덱스된 필드가 포함된 문서에 대한 항목만 포함됩니다.

    복합 와일드카드 인덱스의 모든 필드가 누락된 경우 문서가 인덱싱되지 않습니다.

  • 복합 와일드카드 인덱스는 희소 인덱스입니다.

  • 문서에 와일드카드 필드가 누락되었지만 복합 필드 중 하나가 있는 경우 해당 문서가 인덱스에 포함됩니다.

  • 와일드카드 필드를 포함한 인덱스 필드는 오름차순(1) 또는 내림차순(-1)으로 정렬할 수 있습니다.

wildcardProjection 를 사용하여 개별 하위 필드를 지정할 수 있습니다.

db.runCommand(
{
createIndexes: "salesData",
indexes: [
{
key: {
tenantId: 1,
"$**": 1
},
name: "tenant_customFields_projection",
wildcardProjection: {
"customFields.addr": 1,
"customFields.name": 1
}
}
]
}
)

와일드카드 인덱스 용어 "$**" 은 컬렉션의 모든 필드를 지정합니다. wildcardProjection 은 인덱스를 지정된 필드 "customFields.addr""customFields.name" 으로 제한합니다.

와일드카드 텀이 $** 인 경우에만 wildcardProjection 을 사용할 수 있습니다.

MongoDB는 대부분의 데이터베이스 명령 에 대해 셸 헬퍼 메서드 를 제공합니다. 이러한 shell 메서드는 구문이 간소화되었으며 기능적으로 데이터베이스 명령과 동일합니다.

첫 번째 예제의 셸 헬퍼는 다음과 같습니다.

db.salesData.createIndex(
{ tenantId: 1, "customFields.$**": 1 },
{
name: "tenant_customFields_shellHelper"
}
)

두 번째 예제의 셸 헬퍼는 다음과 같습니다.

db.salesData.createIndex(
{ tenantId: 1, "$**": 1 },
{ "wildcardProjection": {
"customFields.addr": 1,
"customFields.name": 1
},
name: "tenant_customFields_projection_helper"
}
)

shell 명령과 데이터베이스 명령을 비교하려면 명령 호출 사이에 인덱스를 삭제해야 합니다. 이름이 달라도 동일한 인덱스를 두 번 만들 수는 없습니다.

인덱스를 삭제하려면 인덱스 이름을 삽입하고 db.collection.dropIndex()를 실행합니다.

db.salesData.dropIndex( "tenant_customFields" )

앞의 명령은 salesData 데이터베이스에서 "tenant_customFields" 인덱스를 제거합니다.

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