Índices que não diferenciam maiúsculas de minúsculas
Nesta página
Índices sensíveis a maiúsculas e minúsculas suportam consultas que realizam comparações de string sem considerar maiúsculas e minúsculas. A insensibilidade a maiúsculas e minúsculas é derivada doagrupamento .
Importante
Índices que não diferenciam maiúsculas de minúsculas normalmente não melhoram o desempenho de queries$regex
. A implementação $regex
não reconhece agrupamentos e não pode utilizar índices que não diferenciam maiúsculas de minúsculas de forma eficiente.
Sintaxe do comando
Você pode criar um índice sem diferenciação de maiúsculas e minúsculas com db.collection.createIndex()
especificando a opção collation
:
db.collection.createIndex( { <field>: <sortOrder> }, { collation: { locale : <locale>, strength : < 1 | 2 > } } )
Para especificar um agrupamento para um índice que não diferencia maiúsculas de minúsculas, inclua os seguintes campos no objeto collation
:
Campo | Descrição |
---|---|
locale | Especifica as regras do idioma. Para obter uma lista de locais disponíveis, consulte Idiomas e locais aceitos. |
strength | Determina as regras de comparação. Um valor de strength de 1 ou 2 indica um agrupamento sem diferenciação de maiúsculas e minúsculas. |
Para campos de agrupamento adicionais, consulte Agrupamento.
Comportamento
Para usar um índice que especifica um agrupamento, as operações de consulta e classificação devem especificar o mesmo agrupamento que o índice. Se uma coleção tiver definido um agrupamento, todas as consultas e índices herdarão esse agrupamento, a menos que especifiquem explicitamente um agrupamento diferente.
Exemplos
Crie um índice que não diferencia maiúsculas de minúsculas
Para usar um índice que não diferencia maiúsculas de minúsculas em uma collection sem agrupamento padrão, crie um índice com agrupamento e defina o parâmetro strength
como 1
ou 2
(consulte Agrupamento para obter uma descrição detalhada do parâmetro strength
). Você deve especificar o mesmo agrupamento no nível da consulta para usar o agrupamento em nível de índice.
O exemplo abaixo cria uma collection sem agrupamento padrão e, em seguida, adiciona um índice no campo type
com um agrupamento sem diferenciação de maiúsculas e minúsculas.
db.createCollection("fruit") db.fruit.createIndex( { type: 1 }, { collation: { locale: 'en', strength: 2 } } )
Para usar o índice, as consultas devem especificar o mesmo agrupamento.
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 que não diferenciam maiúsculas de minúsculas em collections com um agrupamento padrão
Quando você cria uma coleção com um agrupamento padrão, todos os índices criados posteriormente herdam esse agrupamento, a menos que você especifique um agrupamento diferente. Todas as consultas que não especificam um agrupamento diferente também herdam o agrupamento padrão.
O exemplo a seguir cria uma coleção chamada names
com um agrupamento padrão e, em seguida, cria um índice no campo first_name
.
db.createCollection("names", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { first_name: 1 } ) // inherits the default collation
Insira uma pequena coleção de nomes:
db.names.insertMany( [ { first_name: "Betsy" }, { first_name: "BETSY"}, { first_name: "betsy"} ] )
As consultas nessa coleção usam o agrupamento especificado por padrão e, se possível, também usam o índice.
db.names.find( { first_name: "betsy" } ) // inherits the default collation: { collation: { locale: 'en_US', strength: 2 } } // finds three results
A operação acima usa o agrupamento padrão da coleção e localiza todos os três documentos. Ele usa o índice no campo first_name
para melhor desempenho.
Ainda é possível realizar pesquisas com distinção entre maiúsculas e minúsculas nessa coleção, especificando um agrupamento diferente na consulta:
db.names.find( { first_name: "betsy" } ).collation( { locale: 'en_US' } ) // does not use the collection's default collation, finds one result
A operação acima encontra apenas um documento, pois usa um agrupamento sem nenhum valor strength
especificado. Ele não usa o agrupamento padrão da coleção nem o índice.