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

와일드카드 인덱스 제한

이 페이지의 내용

  • 복합 와일드카드 인덱스 제한
  • 호환되지 않는 인덱스 속성
  • 호환되지 않는 인덱스 유형
  • 샤드 키
  • 지원되지 않는 쿼리 패턴
  • 배열 필드가 다음과 같지 않음 null
  • 문서 및 배열의 동등성 매치
  • 필드가 존재하지 않음
  • 다중 필드 쿼리 조건자
  • 정렬을 사용한 쿼리

이 페이지에서는 호환되지 않는 속성 및 지원되지 않는 쿼리 패턴과 같은 와일드카드 인덱스에 대한 제한 사항에 대해 설명합니다.

복합 와일드카드 인덱스 에는 다음과 같은 제한 사항이 있습니다.

  • 복합 와일드카드 인덱스에는 와일드카드 용어가 하나만 있을 수 있습니다.

    예를 들어 다음 인덱스는 지정할 수 없습니다.

    { 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 와(과) 같지 않은 문서에 대한 쿼리를 지원할 수 없습니다.

예를 들어 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는 쿼리 조건자의 한 부분을 지원하기 위해 와일드카드가 아닌 인덱스를 사용하고 다른 부분을 지원하기 위해 와일드카드 인덱스를 사용할 수 없습니다.

  • MongoDB는 동일한 쿼리에서 서로 다른 술어를 지원하기 위해 여러 와일드카드 인덱스를 사용할 수 없습니다.

  • 단일 와일드카드 인덱스가 여러 쿼리 필드를 지원할 수 있는 경우, MongoDB는 쿼리 필드 중 하나를 지원하는 데 와일드카드 인덱스만 사용할 수 있습니다. MongoDB는 관련 와일드카드 인덱스 경로를 기반으로 와일드카드 인덱스로 지원할 필드를 자동으로 선택합니다.

예를 들어 product_attributes 에 와일드카드 인덱스가 있는 inventory 컬렉션을 생각해 보겠습니다. 와일드카드 인덱스는 다음 쿼리의 모든 조건자를 지원할 수 없습니다.

db.inventory.find(
{
"product_attributes.price": { $gt: 20 },
"product_attributes.material": "silk",
"product_attributes.size": "large"
}
)

대신 MongoDB는 와일드카드 인덱스를 사용하여 쿼리 조건자 중 하나만 지원합니다. MongoDB는 관련 와일드카드 인덱스 경로를 기반으로 지원할 조건자를 선택합니다. 지원되지 않는 쿼리 조건자는 설명 rejectedPlans 결과 의 에 표시됩니다.

참고

$or 동작

MongoDB는 동일한 와일드카드 인덱스를 사용하여 쿼리 $or 또는 애그리게이션 $or 연산자의 각 독립적인 인수를 지원할 수 있습니다.

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() 을 모두 충족할 수 있습니다.

← 와일드카드 인덱스 서명