대소문자를 구분하지 않는 인덱스
대소문자를 구분하지 않는 인덱스는 대소문자를 구분하지 않고 string 비교를 수행하는 쿼리를 지원 합니다. 대소문자를 구분하지 않는 것은 데이터 정렬에서 파생됩니다.
중요
대소문자를 구분하지 않는 인덱스는 일반적으로 $regex
쿼리에 대한 성능을 향상시키지 않습니다. $regex
구현은 데이터 정렬을 인식하지 못하며 대소문자를 구분하지 않는 인덱스를 효율적으로 사용할 수 없습니다.
명령 구문
collation
옵션을 지정하여 db.collection.createIndex()
로 대소문자를 구분하지 않는 인덱스를 만들 수 있습니다.
db.collection.createIndex( { <field>: <sortOrder> }, { collation: { locale : <locale>, strength : < 1 | 2 > } } )
대소문자를 구분하지 않는 인덱스에 대한 대조를 지정하려면 collation
객체에 다음 필드를 포함합니다.
필드 | 설명 |
---|---|
| 언어 규칙을 지정합니다. 사용 가능한 국가 및 언어 설정 목록은 지원되는 국가 및 언어 설정을 참조하세요. |
| 비교 규칙을 결정합니다. |
추가 데이터 정렬 필드에 대해서는 데이터 정렬을참조하세요.
행동
데이터 정렬을 지정하는 인덱스를 사용하려면, 쿼리 및 정렬 작업에서 인덱스와 동일한 데이터 정렬을 지정해야 합니다. 컬렉션에 데이터 정렬이 정의되어 있다면, 모든 쿼리와 인덱스는 다른 데이터 정렬을 명시적으로 지정하지 않는 한 해당 데이터 정렬을 상속합니다.
예시
대소문자를 구분하지 않는 인덱스 생성
기본 데이터 정렬이 없는 컬렉션에서 대소문자를 구분하지 않는 인덱스를 사용하려면 데이터 정렬이 있는 인덱스를 만들고 strength
매개변수를 1
또는 2
로 설정합니다(strength
매개변수에 대한 자세한 설명은 데이터 정렬 참조). 인덱스 수준 데이터 정렬을 사용하려면 쿼리 수준에서 동일한 데이터 정렬을 지정해야 합니다.
다음 예시에서는 기본 데이터 정렬이 없는 컬렉션을 만든 다음 대소문자를 구분하지 않는 데이터 정렬을 사용하여 type
필드에 인덱스를 추가합니다.
db.createCollection("fruit") db.fruit.createIndex( { type: 1 }, { collation: { locale: 'en', strength: 2 } } )
인덱스를 사용하려면 쿼리에서 동일한 데이터 정렬을 지정해야 합니다.
db.fruit.insertMany( [ { type: "apple" }, { type: "Apple" }, { type: "APPLE" } ] ) db.fruit.find( { type: "apple" } ) // does not use index, finds one result db.fruit.find( { type: "apple" } ).collation( { locale: 'en', strength: 2 } ) // uses the index, finds three results db.fruit.find( { type: "apple" } ).collation( { locale: 'en', strength: 1 } ) // does not use the index, finds three results
기본 데이터 정렬을 사용하는 컬렉션의 대소문자를 구분하지 않는 인덱스
기본 데이터 정렬을 사용하여 컬렉션을 만들 경우, 다른 데이터 정렬을 지정하지 않는 한 이후에 생성하는 모든 인덱스가 해당 데이터 정렬을 상속합니다. 다른 데이터 정렬을 지정하지 않는 모든 쿼리도 기본 데이터 정렬을 상속합니다.
다음 예시에서는 names
이라는 기본값 데이터 정렬을 사용하여 컬렉션을 만든 다음 first_name
필드에 인덱스를 만듭니다.
db.createCollection("names", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { first_name: 1 } ) // inherits the default collation
이름의 작은 컬렉션을 삽입합니다.
db.names.insertMany( [ { first_name: "Betsy" }, { first_name: "BETSY"}, { first_name: "betsy"} ] )
이 컬렉션에 대한 쿼리는 기본적으로 지정된 데이터 정렬을 사용하며, 가능한 경우 인덱스도 사용합니다.
db.names.find( { first_name: "betsy" } ) // inherits the default collation: { collation: { locale: 'en_US', strength: 2 } } // finds three results
위 작업은 컬렉션의 기본 데이터 정렬을 사용하고 세 문서를 모두 찾습니다. 더 나은 성능을 위해 first_name
필드의 인덱스를 사용합니다.
쿼리에 다른 데이터 정렬을 지정하여 이 컬렉션에서 대소문자를 구분하여 검색할 수도 있습니다.
db.names.find( { first_name: "betsy" } ).collation( { locale: 'en_US' } ) // does not use the collection's default collation, finds one result
위 작업은 strength
값이 지정되지 않은 데이터 정렬을 사용하기 때문에 하나의 문서만 찾습니다. 컬렉션의 기본 데이터 정렬이나 인덱스를 사용하지 않습니다.