MongoDB Expressão regular (Regex) com exemplos

Expressões regulares são usadas para correspondência de padrões, que é basicamente para encontrar strings 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 Employee que possui os nomes de campo “Employeeid” e “EmployeeName”. Suponhamos 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

Aqui no código abaixo usamos 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)

Explicação do código:

  1. Aqui queremos encontrar todos os nomes de funcionários que contenham os caracteres 'Gu'. Portanto, especificamos o operador $regex para definir os critérios de pesquisa de '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 possua os seguintes documentos com um documento adicional que contém o Nome do Funcionário como “Guru999”. Se você inserisse o critério de pesquisa como “Guru99”, também retornaria o documento que continha “Guru999”. Mas suponha que não quiséssemos isso e quisé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 $ 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)

Explicação do código:

  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 $ é usado para garantir que a string termine com um determinado caractere. Portanto, quando o código for executado ele irá 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” foi obtida.

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 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 Employee que possui os nomes de campo “Employeeid” e “EmployeeName”.

Suponhamos 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 veríamos o documento com “GURU99” no resultado. Para garantir que isso apareça no conjunto de resultados, precisamos adicionar o parâmetro $options “I”.

Correspondência de padrões com $options

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

Explicação do código:

  1. O parâmetro $options com 'I' (que significa insensibilidade a maiúsculas e minúsculas) especifica que queremos realizar a pesquisa 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. A saída mostra claramente que, mesmo que um documento tenha 'Gu' maiúsculo, o documento ainda é exibido no conjunto de resultados.

Correspondência de padrões sem o operador regex

Também é possível fazer 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)

Explicação do código:

  1. As opções “//” basicamente significam especificar seus critérios de pesquisa dentro desses delimitadores. Portanto, estamos especificando /Gu/ para localizar novamente os documentos que possuem '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 das etapas a seguir

O exemplo a seguir mostra como isso pode ser feito.

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

Suponhamos 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

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

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

Explicação do código:

1) Ao consultar os documentos, use a função sort para classificar os registros na ordem inversa com base no valor do campo _id na coleção. O -1 indica basicamente ordenar os documentos em ordem inversa ou decrescente para 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 limite (2), para que ela busque os dois últimos documentos.

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

Saída:

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

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

Resumo

  • A correspondência de padrões pode ser obtida pelo operador $regex. Este operador pode ser usado para localizar determinadas strings na coleção.
  • Os símbolos ^ e $ podem ser usados ​​para pesquisas de texto exato, sendo ^ usado para garantir que a string comece com um determinado caractere e $ usado para garantir que a string termine com um determinado caractere.
  • O 'i' junto com o operador $regex pode ser usado para especificar a insensibilidade a maiúsculas e minúsculas, para que as strings possam ser pesquisadas, estejam elas em minúsculas ou maiúsculas.
  • Os delimitadores // também podem ser usados ​​para correspondência de padrões.
  • Use uma combinação de classificação e função limit para retornar os últimos n documentos da coleção. A função sort pode ser usada para retornar os documentos em ordem decrescente, após a qual a cláusula limit pode ser usada para limitar o número de documentos retornados.