Se suas queries dependerem de uma correspondência ineficiente de expressões regulares, crie e execute uma query do MongoDB Search com o $search
estágio do pipeline de agregação para melhorar o desempenho das queries de texto que têm mais opções para personalizar seus parâmetros de query.
Evite correspondência Regex ineficiente
Se você costuma executar queries regex sem distinção entre maiúsculas e minúsculas (utilizando a opção i
), recomendamos o uso de queries do MongoDB Search que usem o agregação pipeline stage$search
.
É possível especificar agrupamento em um índice para definir regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e acentos. No entanto, o agrupamento pode causar alguma perda de funcionalidade em comparação com as queries do MongoDB Search. Em ambientes que não sejam do MongoDB Search, índices sensíveis a maiúsculas e minúsculas não melhoram o desempenho das queries regex. O operador de query $regex
não reconhece agrupamentos e não pode usar índices sensíveis a maiúsculas e minúsculas de forma eficaz. Os índices de pesquisa do MongoDB melhoram significativamente o desempenho de queries que diferenciam maiúsculas de minúsculas e oferecem mais opções para personalizar parâmetros de query.
Exemplo
Considere uma recolha employees
com os seguintes documentos. Esta coleção não tem índices além do índice _id
padrão:
// employees collection { "_id": 1, "first_name": "Hannah", "last_name": "Simmons", "dept": "Engineering" }, { "_id": 2, "first_name": "Michael", "last_name": "Hughes", "dept": "Security" }, { "_id": 3, "first_name": "Wendy", "last_name": "Crawford", "dept": "Human Resources" }, { "_id": 4, "first_name": "MICHAEL", "last_name": "FLORES", "dept": "Sales" }
Se o seu aplicação consulta frequentemente o campo first_name
, talvez você queira executar queries regex sem distinção entre maiúsculas e minúsculas para encontrar mais facilmente os nomes correspondentes. O regex com distinção entre maiúsculas e minúsculas também corresponde a formatos de dados diferentes, como no exemplo acima, em que você tem first_names
de "Michael" e "MICHAEL". No entanto, recomendamos as queries do MongoDB Search que usam o estágio do pipeline de agregação $search
.
Se um usuário pesquisar a string "michael", o aplicativo poderá executar a seguinte query:
db.employees.find( { first_name: { $regex: /michael/i } } )
Como essa query especifica a opção i
de $regex, ela não diferencia maiúsculas de minúsculas. A query retorna os seguintes documentos:
{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" } { "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }
Embora essa query retorne os documentos esperados, as queries regex sem distinção entre maiúsculas e minúsculas e sem suporte a índices não são muito eficientes. Para melhorar o desempenho, crie um índice de Pesquisa MongoDB:
{ "mappings": { "dynamic": true } }
O agrupamento pode causar alguma perda de funcionalidade. Quando o campo strength
de um documento collation
de um índice é 1
ou 2
, o índice não diferencia maiúsculas de minúsculas. Para obter uma descrição detalhada do documento do agrupamento e dos diferentes valores de strength
, consulte Documento de agrupamento.
Para que o aplicação use o índice que diferencia maiúsculas de minúsculas, você também deve especificar o mesmo documento de agrupamento do índice na query regex. Embora seja possível remover o operador $regex
do método find()
anterior e usar o índice recém-criado, recomendamos que você use uma query do MongoDB Search que utilize o estágio do pipeline de agregação $search
.
Query sem distinção entre maiúsculas e minúsculas | Query de pesquisa do MongoDB | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Importante
Não use o operador $regex ao usar um índice que não diferencia maiúsculas de minúsculas em sua query. A implementação $regex
não reconhece agrupamentos e não pode utilizar índices que não diferenciam maiúsculas de minúsculas. Em vez disso, recomendamos queries do MongoDB Search que usem o estágio do pipeline de agregação $search
.
Saiba mais
Para saber mais sobre queries de pesquisa MongoDB, consulte Queries e índices.
Para saber mais sobre índices sensíveis a maiúsculas e minúsculas com exemplos ilustrativos, consulte Índices sensíveis a maiúsculas e minúsculas.
Para saber mais sobre queries regex no MongoDB, consulte $regex.
A Universidade de MongoDB oferece um curso gratuito sobre como otimizar o desempenho do MongoDB. Para saber mais, consulte Monitoramento e insights.