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.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Explicação do código:
- 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'
- 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:
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.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Explicação do código:
- 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”.
- 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:
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”.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Explicação do código:
- 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:
- 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.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Explicação do código:
- 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:
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 |
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:
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.