MongoDB Expresiones regulares ($regex) con ejemplos
โก Resumen inteligente
MongoDB Las expresiones regulares realizan la coincidencia de patrones para encontrar cadenas dentro de los documentos, utilizando el operador $regex, el indicador $options para no distinguir entre mayรบsculas y minรบsculas, anclas para coincidencias exactas y delimitadores de barra diagonal cuando se desconoce el valor exacto del campo.

Las expresiones regulares se utilizan para la bรบsqueda de patrones, que bรกsicamente consiste en encontrar cadenas de texto dentro de los 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
El operador $regex 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 |
En el cรณdigo que aparece a continuaciรณn, hemos utilizado el operador $regex para especificar los criterios de bรบsqueda.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code Explicaciรณn:
- Aquรญ queremos encontrar todos los nombres de empleados que contengan los caracteres 'Gu'. Por lo tanto, especificamos el operador $regex para definir el criterio 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รณ los criterios de bรบsqueda como โGuru99โ, tambiรฉn devolverรญa el documento que tenรญa โGuru999โ. Pero supongamos que no quisiรฉramos esto y solo quisiรฉramos devolver el documento con โGuru99โ. Entonces podemos hacerlo con coincidencia de patrรณn exacta. Para hacer una coincidencia de patrรณn exacta, usaremos los caracteres ^ y $. Agregaremos el carรกcter ^ al principio 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)
Code Explicaciรณn:
- Aquรญ en los criterios de bรบsqueda, estamos usando los caracteres ^ y $. El ^ se usa para asegurar que la cadena comience con un carรกcter determinado, y el $ se usa para asegurar que la cadena termine con un carรกcter determinado. Entonces, cuando se ejecute el cรณdigo, solo recuperarรก 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 la salida, se ve claramente que la cadena โGuruSe recuperan 99โ.
Coincidencia de patrones con $options
Al usar 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 el 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 bien, si ejecutamos la misma consulta que en el tema anterior, nunca veremos el documento con โGURU99โ en el resultado. Para asegurarnos de que aparezca en el conjunto de resultados, debemos agregar el parรกmetro โiโ de $options.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code Explicaciรณn:
- La opciรณn $options con el parรกmetro 'i' (que significa insensibilidad a mayรบsculas y minรบsculas) especifica que queremos realizar la bรบsqueda independientemente de 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 contiene la palabra "Gu" en mayรบsculas, el documento sigue apareciendo en el conjunto de resultados.
Coincidencia de patrones sin el operador regex
Tambiรฉn se puede realizar la coincidencia de patrones sin el operador $regex. El siguiente ejemplo muestra cรณmo hacerlo.
db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
Code Explicaciรณn:
- Los delimitadores โ//โ sirven bรกsicamente para especificar los criterios de bรบsqueda dentro de ellos. Por lo tanto, especificamos /Gu/ para encontrar nuevamente aquellos documentos que contengan 'Gu' en su EmployeeName.
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.
Analicemos una de las maneras siguiendo 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)
Code Explicaciรณn:
- 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 valor -1 indica que los documentos se ordenen en orden inverso o descendente, de modo que el รบltimo documento sea el primero en mostrarse.
- Luego, usa la clรกusula LIMIT para mostrar solo la cantidad de registros que deseas. Aquรญ hemos configurado la clรกusula LIMIT (2), por lo que se mostrarรกn 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.










