Use o Atlas Search para queries Regex de texto completo
Se suas queries dependerem de uma correspondência de expressão ineficiente, crie e execute uma query do Atlas Search com o estágio do pipeline de agregação $search
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 que não diferenciam maiúsculas de minúsculas (utilizando a opção i
), recomendamos o uso de queries do Atlas 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 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 aplicação consulta frequentemente o first_name
campo , 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 $search
estágio do pipeline de agregação.
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 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 Atlas Search que utilize o estágio 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 o estágio do pipeline de agregação $search
.
Saiba mais
Para saber mais sobre queries do Atlas Search, 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.