Menu Docs
Página inicial do Docs
/
Atlas
/ /

Use o MongoDB Search para queries Regex de texto completo

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.

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.

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
db.employees.find( { first_name: "michael" } ).collation( { locale: 'en', strength: 2 } )
db.employees.aggregate([
{
$search: {
"index": "default",
"text": {
"path": "first_name",
"query": "michael"
}
}
}
])

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.

  • 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.

Nesta página