Use o Atlas Search para queries Regex de texto completo
Se suas queries dependerem de uma correspondência regex ineficiente, crie e execute uma query do Atlas Search com as fases do pipeline de agregação $search para melhorar o desempenho de queries de texto que possuem mais opções para personalizar seus parâmetros de query.
Evite correspondência Regex ineficiente
Se você costuma executar queries regex que não diferenciam maiúsculas de minúsculas (utilizando a opção i
), recomendamos usar queries do Atlas Search que usem o aggregation pipeline stage $search.
É possível especificar agrupamento em um índice para definir regras específicas do idioma para comparação de string , 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 Atlas Search. Em ambientes que não sejam do Atlas Search, índices sensíveis a maiúsculas e minúsculas não melhoram o desempenho das consultas de 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 do Atlas Search melhoram significativamente o desempenho de queries que diferenciam maiúsculas de minúsculas e oferecem mais opções para personalizar os parâmetros da 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 aplicativo 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 Atlas 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 incompatíveis com índices não são muito eficientes. Para melhorar o desempenho, crie um índice do Atlas Search:
{ "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 aplicativo 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 Atlas Search que utilize a fase do pipeline de agregação $search.
Query sem distinção entre maiúsculas e minúsculas | Query do Atlas Search | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
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 as queries do Atlas Search que usam a fase do pipeline de agregação $search.
Saiba mais
Para mais informações sobre queries de pesquisa do Atlas, consulte Crie e execute queries de pesquisa do Atlas.
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.