MongoDB Expressão regular ($regex) com exemplos

⚡ Resumo Inteligente

MongoDB As expressões regulares realizam a correspondência de padrões para encontrar strings dentro de documentos, usando o operador $regex, o sinalizador $options para ignorar maiúsculas e minúsculas, âncoras para correspondências exatas e delimitadores de barra quando o valor exato do campo é desconhecido.

  • 🔍 $regex Operator: db.collection.find({field:{$regex:”pattern”}}) encontra documentos que contêm o padrão.
  • 🎯 Anchors: ^ e $ forçam correspondências exatas, vinculando o padrão ao início e ao fim da string.
  • 🔠 Insensibilidade a maiúsculas e minúsculas: A flag 'i' do $options corresponde ao texto independentemente de ser maiúscula ou minúscula.
  • ➗ Delimitadores de barra: Embrulheping um padrão em /…/ corresponde sem escrever o operador $regex.
  • 📉 Últimos N documentos: Combine sort({_id:-1}) com limit(n) para retornar os registros mais recentes.
  • 🤖 Assistência de IA: Os assistentes criam padrões de expressões regulares e sinalizam os custos de desempenho da varredura completa da coleção.

MongoDB Expressão regular (Regex)

Expressões regulares são usadas para correspondência de padrões, que basicamente serve para encontrar sequências de caracteres em documentos.

Às vezes, ao recuperar documentos em uma coleção, você pode não saber exatamente qual é o valor exato do campo a ser pesquisado. Conseqüentemente, pode-se usar expressões regulares para auxiliar na recuperação de dados com base em valores de pesquisa de correspondência de padrões.

Usando o operador $regex para correspondência de padrões

O operador $regex em MongoDB é usado para procurar strings específicas na coleção. O exemplo a seguir mostra como isso pode ser feito.

Vamos supor que temos nossa mesma coleção de Funcionários com os campos "Employeeid" e "EmployeeName". Vamos supor também que temos os seguintes documentos em nossa coleção.

ID do Empregado nome do empregado
22 NovoMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

No código abaixo, utilizamos o operador $regex para especificar os critérios de pesquisa.

Usando $regex Operator para correspondência de padrões

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code Explicação:

  1. Aqui, queremos encontrar todos os nomes de funcionários que contenham os caracteres 'Gu'. Portanto, especificamos o operador $regex para definir o critério de pesquisa 'Gu'.
  2. O printjson está sendo usado para imprimir melhor cada documento que é retornado pela consulta.

Se o comando for executado com sucesso, a seguinte saída será mostrada:

Saída:

Usando $regex Operator para correspondência de padrões

A saída mostra claramente que os documentos em que o Nome do Funcionário contém os caracteres 'Gu' são retornados.

Suponha que sua coleção contenha os seguintes documentos, além de um documento adicional que inclua o nome do funcionário como “Guru999”. Se você inseriu os critérios de pesquisa como “Guru99”, também retornaria o documento que continha “Guru999”. Mas suponha que não quiséssemos isso e desejássemos apenas devolver o documento com “Guru99”. Então podemos fazer isso com correspondência exata de padrões. Para fazer uma correspondência exata de padrões, usaremos os caracteres ^ e $. Adicionaremos o caractere ^ no início da string e o $ no final da string.

ID do Empregado nome do empregado
22 NovoMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

O exemplo a seguir mostra como isso pode ser feito.

Usando $regex Operator para correspondência de padrões

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code Explicação:

  1. Aqui, nos critérios de pesquisa, estamos usando os caracteres ^ e $. O ^ é usado para garantir que a string comece com um determinado caractere, e o $ é usado para garantir que a string termine com um determinado caractere. Portanto, quando o código for executado, ele buscará apenas a string com o nome “Guru99".
  2. O printjson está sendo usado para imprimir melhor cada documento que é retornado pela consulta.

Se o comando for executado com sucesso, a seguinte saída será mostrada:

Saída:

Usando $regex Operator para correspondência de padrões

Na saída, é claramente visível que a string “Guru99” é buscado.

Correspondência de padrões com $options

Ao usar o operador $regex, também é possível fornecer opções adicionais usando o $ opções palavra-chave. Por exemplo, suponha que você queira encontrar todos os documentos que tinham 'Gu' no nome do funcionário, independentemente de diferenciar maiúsculas de minúsculas ou não. Se tal resultado for desejado, então precisaremos usar o $ opções com o parâmetro de insensibilidade a maiúsculas e minúsculas.

O exemplo a seguir mostra como isso pode ser feito.

Vamos supor que temos nossa mesma coleção de Funcionários, que possui os nomes de campo “Employeeid” e “EmployeeName”.

Vamos supor também que temos os seguintes documentos em nossa coleção.

ID do Empregado nome do empregado
22 NovoMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU 99

Agora, se executarmos a mesma consulta do tópico anterior, nunca veremos o documento com “GURU99” no resultado. Para garantir que ele apareça no conjunto de resultados, precisamos adicionar o parâmetro “i” da opção $options.

Correspondência de padrões com $options

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code Explicação:

  1. A opção `$options` com o parâmetro 'i' (que significa insensibilidade a maiúsculas e minúsculas) especifica que queremos realizar a busca independentemente de encontrarmos as letras 'Gu' em maiúsculas ou minúsculas.

Se o comando for executado com sucesso, a seguinte saída será mostrada:

Saída:

Correspondência de padrões com $options

  1. O resultado mostra claramente que, mesmo que um documento contenha a letra maiúscula 'Gu', ele ainda é exibido no conjunto de resultados.

Correspondência de padrões sem o operador regex

Também é possível realizar a correspondência de padrões sem o operador $regex. O exemplo a seguir mostra como isso pode ser feito.

Correspondência de padrões sem o Regex Operator

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code Explicação:

  1. Os delimitadores “//” servem basicamente para especificar os critérios de pesquisa dentro desses delimitadores. Portanto, estamos especificando /Gu/ para encontrar novamente os documentos que contêm 'Gu' em seu EmployeeName.

Se o comando for executado com sucesso, a seguinte saída será mostrada:

Saída:

Correspondência de padrões sem o Regex Operator

A saída mostra claramente que os documentos em que o Nome do Funcionário contém os caracteres 'Gu' são retornados.

Buscando os últimos 'n' documentos de uma coleção

Existem várias maneiras de obter os últimos n documentos de uma coleção.

Vejamos uma das maneiras através dos seguintes passos.

O exemplo a seguir mostra como isso pode ser feito.

Vamos supor que temos nossa mesma coleção de Funcionários, que possui os nomes de campo “Employeeid” e “EmployeeName”.

Vamos supor também que temos os seguintes documentos em nossa coleção:

ID do Empregado nome do empregado
22 NovoMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU 99

Recuperando os últimos n documentos de uma coleção

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code Explicação:

  1. Ao consultar os documentos, utilize a função de classificação para ordenar os registros em ordem inversa com base no valor do campo _id na coleção. O valor -1 indica que os documentos devem ser classificados em ordem inversa ou decrescente, de modo que o último documento seja o primeiro a ser exibido.
  2. Em seguida, use a cláusula LIMIT para exibir apenas o número de registros desejado. Aqui, definimos a cláusula LIMIT (2), para que sejam retornados os dois últimos documentos.

Se o comando for executado com sucesso, a seguinte saída será mostrada:

Saída:

Recuperando os últimos n documentos de uma coleção

A saída mostra claramente que os dois últimos documentos da coleção são exibidos. Portanto, mostramos claramente que para buscar os últimos 'n' documentos da coleção, podemos primeiro classificar os documentos em ordem decrescente e depois usar a cláusula limit para retornar o número 'n' de documentos necessários.

Observação: se a pesquisa for realizada em uma string com mais de 38,000 caracteres, ela não exibirá os resultados corretos.

Perguntas Frequentes

Anchor o padrão com ^ e $. O padrão “^Guru99$” corresponde apenas a “Guru99” e rejeita “Guru999”, porque ^ delimita o início da string e $ delimita o fim.

Somente padrões que diferenciam maiúsculas de minúsculas e possuem o prefixo ^ utilizam um índice de forma eficiente. Padrões não ancorados ou que não diferenciam maiúsculas de minúsculas acionam uma varredura completa da coleção; portanto, ancore o prefixo sempre que possível.

Preceda metacaracteres como ponto, asterisco, sinal de mais ou colchetes com uma barra invertida. Por exemplo, o padrão para uma terminação literal ".com" escapa o ponto para que ele não seja tratado como nenhum caractere.

A função `$regex` realiza correspondência de padrões flexível em um campo e pode examinar toda a coleção. A função `$text` usa um índice de texto para busca rápida baseada em palavras em campos indexados, mas não suporta padrões de substrings parciais.

Sim. Quando a string de pesquisa ultrapassa aproximadamente 38,000 caracteres, a consulta pode não retornar resultados corretos. Mantenha os padrões e os campos de destino dentro desse limite para uma correspondência confiável.

Armazene uma cópia em minúsculas do campo para pesquisas que não diferenciam maiúsculas de minúsculas, ancore padrões com ^ e prefira um índice de texto ou a Pesquisa Atlas em coleções grandes em vez de $regex sem âncora.

Os assistentes de IA transformam regras em linguagem natural em padrões $regex, adicionam as âncoras corretas e o sinalizador $options e avisam quando uma consulta acionará uma varredura completa e lenta da coleção.

Sim. Um copiloto de IA reescreve padrões não ancorados, recomenda um índice de texto ou uma busca no Atlas e converte expressões regulares (`$regex`) que não diferenciam maiúsculas de minúsculas em uma pesquisa de campo em minúsculas para maior velocidade.

Resuma esta postagem com: