MongoDB Expresión regular (Regex) con ejemplos
Las expresiones regulares se utilizan para la coincidencia de patrones, que es básicamente para cadenas de resultados dentro de documentos.
A veces, al recuperar documentos de una colección, es posible que no sepa exactamente cuál es el valor de campo exacto que debe buscar. Por lo tanto, se pueden utilizar expresiones regulares para ayudar a recuperar datos basados en valores de búsqueda de coincidencia de patrones.
Uso del operador $regex para la coincidencia de patrones
La característica operador de expresiones regulares en MongoDB se utiliza para buscar cadenas específicas en la colección. El siguiente ejemplo muestra cómo se puede hacer esto.
Supongamos que tenemos nuestra misma colección de empleados que tiene los nombres de campo "Employeeid" y "EmployeeName". Supongamos también que tenemos los siguientes documentos en nuestra colección.
ID de empleado | Nombre de empleado |
---|---|
22 | nuevomartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Viejo |
Aquí, en el siguiente código, hemos utilizado el operador de expresiones regulares para especificar los criterios de búsqueda.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Explicación del código:
- Aquí queremos encontrar todos los nombres de empleados que tengan los caracteres "Gu". Por lo tanto, especificamos el operador $regex para definir los criterios de búsqueda de 'Gu'
- printjson se utiliza para imprimir mejor cada documento devuelto por la consulta.
Si el comando se ejecuta correctamente, se mostrará la siguiente salida:
Salida:
El resultado muestra claramente que se devuelven aquellos documentos en los que el nombre del empleado contiene los caracteres "Gu".
Supongamos que su colección tiene los siguientes documentos con un documento adicional que contiene el nombre del empleado como "Guru999". Si ingresó el criterio de búsqueda como "Guru99", también devolvería el documento que tenía "Guru999". Pero supongamos que no queremos esto y solo queremos devolver el documento con "Guru99". Entonces podemos hacer esto con una coincidencia de patrón exacta. Para hacer una coincidencia de patrón exacta, usaremos los caracteres ^ y $. Agregaremos el carácter ^ al comienzo de la cadena y $ al final de la cadena.
ID de empleado | Nombre de empleado |
---|---|
22 | nuevomartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Viejo |
8 | Guru999 |
El siguiente ejemplo muestra cómo se puede hacer esto.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Explicación del código:
- Aquí, en los criterios de búsqueda, utilizamos los caracteres ^ y $. ^ se usa para asegurarse de que la cadena comience con un carácter determinado y $ se usa para garantizar que la cadena termine con un carácter determinado. Entonces, cuando se ejecute el código, solo buscará la cadena con el nombre "Guru99".
- printjson se utiliza para imprimir mejor cada documento devuelto por la consulta.
Si el comando se ejecuta correctamente, se mostrará la siguiente salida:
Salida:
En el resultado, es claramente visible que se recupera la cadena "Guru99".
Coincidencia de patrones con $options
Al utilizar el operador regex, también se pueden proporcionar opciones adicionales mediante el uso de $ opciones palabra clave. Por ejemplo, supongamos que desea encontrar todos los documentos que tengan "Gu" en su nombre de empleado, independientemente de si distinguen entre mayúsculas y minúsculas o no. Si se desea tal resultado, entonces necesitamos usar el $ opciones con parámetro de insensibilidad a mayúsculas y minúsculas.
El siguiente ejemplo muestra cómo se puede hacer esto.
Supongamos que tenemos nuestra misma colección de Empleados que tiene los nombres de campo "Employeeid" y "EmployeeName".
Supongamos también que tenemos los siguientes documentos en nuestra colección.
ID de empleado | Nombre de empleado |
---|---|
22 | nuevomartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Viejo |
7 | Guru99 |
Ahora, si ejecutamos la misma consulta que en el último tema, nunca veremos el documento con "GURU99" en el resultado. Para garantizar que esto aparezca en el conjunto de resultados, debemos agregar el parámetro "I" de $options.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Explicación del código:
- Las $options con parámetro 'I' (que significa insensibilidad a mayúsculas y minúsculas) especifica que queremos realizar la búsqueda sin importar si encontramos las letras 'Gu' en minúsculas o mayúsculas.
Si el comando se ejecuta correctamente, se mostrará la siguiente salida:
Salida:
- El resultado muestra claramente que aunque un documento tenga la mayúscula "Gu", el documento aún se muestra en el conjunto de resultados.
Coincidencia de patrones sin el operador regex
También se puede hacer una comparación de patrones sin el operador de expresiones regulares. El siguiente ejemplo muestra cómo se puede hacer.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Explicación del código:
- Las opciones “//” básicamente significan especificar sus criterios de búsqueda dentro de estos delimitadores. Por lo tanto, estamos especificando /Gu/ para buscar nuevamente aquellos documentos que tienen 'Gu' en su Nombre de Empleado.
Si el comando se ejecuta correctamente, se mostrará la siguiente salida:
Salida:
El resultado muestra claramente que se devuelven aquellos documentos en los que el nombre del empleado contiene los caracteres "Gu".
Obteniendo los últimos 'n' documentos de una colección
Hay varias formas de obtener los últimos n documentos de una colección.
Veamos una de las formas a través de los siguientes pasos.
El siguiente ejemplo muestra cómo se puede hacer esto.
Supongamos que tenemos nuestra misma colección de Empleados que tiene los nombres de campo "Employeeid" y "EmployeeName".
Supongamos también que tenemos los siguientes documentos en nuestra colección:
ID de empleado | Nombre de empleado |
---|---|
22 | nuevomartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Viejo |
7 | Guru99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Explicación del código:
1) Al consultar los documentos, utilice la función de ordenación para ordenar los registros en orden inverso según el valor del campo _id en la colección. El -1 básicamente indica que se deben ordenar los documentos en orden inverso o en orden descendente de modo que el último documento sea el primero que se muestre.
2) Luego use la cláusula de límite para mostrar solo la cantidad de registros que desea. Aquí hemos establecido la cláusula límite (2), por lo que recuperará los dos últimos documentos.
Si el comando se ejecuta correctamente, se mostrará la siguiente salida:
Salida:
El resultado muestra claramente que se muestran los dos últimos documentos de la colección. Por lo tanto, hemos demostrado claramente que para obtener los últimos 'n' documentos de la colección, primero podemos ordenar los documentos en orden descendente y luego usar la cláusula de límite para devolver el número 'n' de documentos que se requieren.
Nota: : Si la búsqueda se realiza en una cadena que tiene más de, digamos, 38,000 caracteres, no mostrará los resultados correctos.
Resumen
- El operador $regex puede lograr la coincidencia de patrones. Este operador se puede utilizar para buscar determinadas cadenas en la colección.
- Los símbolos ^ y $ se pueden usar para búsquedas de texto exacto; ^ se usa para asegurarse de que la cadena comience con un carácter determinado y $ se usa para garantizar que la cadena termine con un carácter determinado.
- El operador 'i' junto con el operador $regex se pueden usar para especificar la insensibilidad a mayúsculas y minúsculas, de modo que se puedan buscar cadenas independientemente de que estén en mayúsculas o minúsculas.
- Los delimitadores // también se pueden utilizar para la coincidencia de patrones.
- Utilice una combinación de clasificación y función de límite para devolver los últimos n documentos de la colección. La función de clasificación se puede utilizar para devolver los documentos en orden descendente, después de lo cual se puede utilizar la cláusula de límite para limitar la cantidad de documentos que se devuelven.