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.

  • ๐Ÿ” $ regex Operacolina: db.collection.find({field:{$regex:โ€patternโ€}}) coincide con los documentos que contienen el patrรณn.
  • ๐ŸŽฏ Anchors: ^ y $ fuerzan coincidencias exactas, vinculando el patrรณn al inicio y al final de la cadena.
  • ๐Ÿ”  Insensibilidad a mayรบsculas y minรบsculas: El indicador 'i' de $options coincide con el texto independientemente de si estรก en mayรบsculas o minรบsculas.
  • โž— Delimitadores de barra diagonal: Envuelvaping un patrรณn en /โ€ฆ/ coincide sin escribir el operador $regex.
  • ๐Ÿ“‰ รšltimos N documentos: Combina sort({_id:-1}) con limit(n) para devolver los registros mรกs recientes.
  • ๐Ÿค– Asistencia de IA: Los asistentes crean patrones de expresiones regulares e indican los costes de rendimiento del escaneo de colecciones completas.

MongoDB Expresiรณn regular (Regex)

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.

Usando $regex OperaTor para coincidencia de patrones

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

Code Explicaciรณn:

  1. 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'.
  2. printjson se utiliza para imprimir mejor cada documento devuelto por la consulta.

Si el comando se ejecuta correctamente, se mostrarรก la siguiente salida:

Salida:

Usando $regex OperaTor para coincidencia de patrones

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.

Usando $regex OperaTor para coincidencia de patrones

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

Code Explicaciรณn:

  1. 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 ".
  2. printjson se utiliza para imprimir mejor cada documento devuelto por la consulta.

Si el comando se ejecuta correctamente, se mostrarรก la siguiente salida:

Salida:

Usando $regex OperaTor para coincidencia de patrones

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.

Coincidencia de patrones con $options

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

Code Explicaciรณn:

  1. 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:

Coincidencia de patrones con $options

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

Coincidencia de patrones sin Regex Operator

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

Code Explicaciรณn:

  1. 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:

Coincidencia de patrones sin Regex Operator

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

Obteniendo los รบltimos n documentos de una colecciรณn.

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

Code Explicaciรณn:

  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 valor -1 indica que los documentos se ordenen en orden inverso o descendente, de modo que el รบltimo documento sea el primero en mostrarse.
  2. 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:

Obteniendo los รบltimos n documentos de una colecciรณn.

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.

Preguntas Frecuentes

Anchor El patrรณn con ^ y $. El patrรณn โ€œ^Guru99$โ€ coincide รบnicamente con โ€œGuru99โ€ y rechaza โ€œGuru999โ€, porque ^ enlaza el inicio de la cadena y $ enlaza el final.

Solo los patrones que distinguen entre mayรบsculas y minรบsculas y que tienen el prefijo ^ utilizan un รญndice de forma eficiente. Los patrones sin anclaje o que no distinguen entre mayรบsculas y minรบsculas activan un escaneo completo de la colecciรณn, por lo que conviene anclar el prefijo siempre que sea posible.

Anteponga una barra invertida a los metacaracteres como el punto, el asterisco, el signo mรกs o los corchetes. Por ejemplo, el patrรณn para una extensiรณn literal โ€œ.comโ€ escapa el punto, por lo que no se trata como ningรบn carรกcter.

$regex realiza coincidencias de patrones flexibles en un campo y puede escanear toda la colecciรณn. $text utiliza un รญndice de texto para bรบsquedas rรกpidas basadas en palabras en campos indexados, pero no admite patrones de subcadenas parciales.

Sรญ. Cuando la cadena de bรบsqueda supera aproximadamente los 38 000 caracteres, es posible que la consulta no arroje resultados correctos. Mantenga los patrones y los campos de destino dentro de ese lรญmite para obtener una coincidencia fiable.

Almacene una copia en minรบsculas del campo para bรบsquedas que no distingan entre mayรบsculas y minรบsculas, ancle patrones con ^ y prefiera un รญndice de texto o una bรบsqueda Atlas en colecciones grandes en lugar de $regex sin anclar.

Los asistentes de IA convierten las reglas en inglรฉs sencillo en patrones $regex, aรฑaden los anclajes y el indicador $options correctos y advierten cuando una consulta activarรก un escaneo completo y lento de la colecciรณn.

Sรญ. Un copiloto de IA reescribe patrones no anclados, recomienda un รญndice de texto o una bรบsqueda en Atlas, y convierte las expresiones regulares que no distinguen entre mayรบsculas y minรบsculas en una bรบsqueda de campo en minรบsculas para mayor velocidad.

Resumir este post con: