Los índices insensibles a mayúsculas y minúsculas admiten queries que realizan comparaciones de string sin tener en cuenta las mayúsculas y minúsculas. La insensibilidad a mayúsculas y minúsculas se deriva de intercalación.
Importante
Los índices que no distinguen entre mayúsculas y minúsculas no mejoran el rendimiento para
$regexconsultas, ya $regex que el operador no tiene en cuenta la intercalación y, por lo tanto, no puede aprovechar dichos índices.
Sintaxis del comando
Puede crear un índice que no distinga entre mayúsculas y minúsculas con especificando db.collection.createIndex() la collation opción:
db.collection.createIndex( { <field>: <sortOrder> }, { collation: { locale : <locale>, strength : < 1 | 2 > } } )
Para especificar una intercalación para un índice sin distinción entre mayúsculas y minúsculas, incluya los siguientes campos en el objeto collation:
Campo | Descripción |
|---|---|
| Especifica las reglas de idioma. Para ver la lista de configuraciones regionales disponibles, consulte Idiomas y configuraciones regionales compatibles. |
| Determina las reglas de comparación. Un valor |
Para obtener campos de intercalación adicionales, consulta intercalación.
Comportamiento
Para usar un índice que especifica una intercalación, las operaciones de query y ordenamiento deben especificar la misma intercalación que el índice. Si una colección ha definido una intercalación, todas las queries e índices heredarán esa intercalación a menos que se especifique explícitamente una diferente.
Ejemplos
Crea un Índice que no distinga entre mayúsculas y minúsculas
Para utilizar un índice que no distinga entre mayúsculas y minúsculas en una colección sin intercalación por defecto, crea un índice con una intercalación y establece el parámetro strength en 1 o 2 (consulta Intercalación para una descripción detallada del parámetro strength). Debe especificar la misma intercalación a nivel de query para poder utilizar la intercalación a nivel de índice.
El siguiente ejemplo crea una colección sin intercalación predeterminada, luego agrega un índice en el campo type con una intercalación insensible a mayúsculas y minúsculas.
db.createCollection("fruit") db.fruit.createIndex( { type: 1 }, { collation: { locale: 'en', strength: 2 } } )
Para utilizar el índice, las consultas deben especificar la misma intercalación.
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
Índices insensibles a mayúsculas y minúsculas en colecciones con una intercalación por defecto
Cuando creas una colección con una intercalación por defecto, todos los índices que crees después heredarán esa intercalación a menos que especifiques una intercalación diferente. Todas las queries que no especifiquen una intercalación diferente heredarán también la intercalación por defecto.
El siguiente ejemplo crea una colección llamada names con una intercalación predeterminada y luego crea un índice en el campo first_name.
db.createCollection("names", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { first_name: 1 } ) // inherits the default collation
Introduce una pequeña colección de nombres:
db.names.insertMany( [ { first_name: "Betsy" }, { first_name: "BETSY"}, { first_name: "betsy"} ] )
Las queries en esta colección utilizan por defecto la intercalación especificada, y si es posible, también utilizan el índice.
db.names.find( { first_name: "betsy" } ) // inherits the default collation: { collation: { locale: 'en_US', strength: 2 } } // finds three results
La operación anterior utiliza la intercalación predeterminada de la colección y encuentra los tres documentos. Utiliza el índice del campo first_name para un mejor rendimiento.
Aún es posible realizar búsquedas que distingan entre mayúsculas y minúsculas en esta colección especificando una intercalación diferente en la consulta:
db.names.find( { first_name: "betsy" } ).collation( { locale: 'en_US' } ) // does not use the collection's default collation, finds one result
La operación anterior solo encuentra un documento, ya que utiliza una intercalación sin valor strength especificado. No utiliza la intercalación predeterminada de la colección ni el índice.