Nota
Esta página describe las funciones de búsqueda de expresiones regulares para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de búsqueda de texto completo.
Atlas Search, que tiene su propia $regex
operador. Para obtener más información, consulte $regex en la documentación de Atlas Search.
Definición
Compatibilidad
Puedes usar $regex para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
Para usar $regex, utilice una de las siguientes sintaxis:
{ <field>: { $regex: /pattern/, $options: '<options>' } } { "<field>": { "$regex": "pattern", "$options": "<options>" } } { <field>: { $regex: /pattern/<options> } }
Nota
Para usar $regex con mongodump, se debe encerrar el documento de query entre comillas simples ('{ ... }') para asegurarse de que no haya interacción con el entorno de shell.
El documento de query debe estar en formato Extended JSON v2 (ya sea en modo relajado o canónico/modo estricto), lo que incluye encerrar los nombres de los campos y los operadores entre comillas. Por ejemplo:
mongodump -d=sample_mflix -c=movies -q='{"year": {"$regex": "20"}}'
En MongoDB, también puedes usar objetos de expresiones regulares (es decir, /pattern/) para especificar expresiones regulares:
{ <field>: /pattern/<options> }
Para restricciones sobre el uso particular de la sintaxis, consultar $regex vs. /pattern/ sintaxis.
Los siguientes <options> están disponibles para su uso con expresiones regulares.
Opción | Descripción |
|---|---|
| No distingue entre mayúsculas y minúsculas para que coincidan las letras en ambos casos. Para ver un ejemplo, consulta Realiza una coincidencia de expresiones regulares sin distinción entre mayúsculas y minúsculas. |
| Para patrones que incluyen anclajes (es decir, Si el patrón no contiene anclas o si el valor de la string no tiene caracteres de nueva línea (p. ej., |
| Capacidad “extendida” para ignorar todos los caracteres de espacio en blanco en el patrón Además, ignora los caracteres entre un carácter de hash/pound ( La opción |
| Permite el carácter punto (es decir, |
| Admite Unicode. Este indicador se acepta, pero es redundante. UTF se establece por defecto en el operador |
Nota
El operador $regex no brinda soporte para el modificador de búsqueda global g.
Comportamiento
$regex vs. /Patrón/ sintaxis
$in Expresiones
Para incluir una expresión regular en un operador de predicado de query $in, solo pueden utilizarse objetos de expresión regular de JavaScript (/pattern/ ).
Por ejemplo:
{ name: { $in: [ /^acme/i, /^ack/ ] } }
No puede usar expresiones de operador $regex dentro de un operador $in.
Condiciones implícitas AND para el campo
Para incluir una expresión regular en una lista separada por comas de condiciones de query para el campo, utilizar el operador $regex. Por ejemplo:
{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } } { name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } } { name: { $regex: 'acme.*corp', $options: 'i', $nin: [ 'acmeblahcorp' ] } }
x y s Opciones
Para usar la opción x o las opciones s, debes usar la expresión del operador $regex con el operador $options. Por ejemplo, para especificar las opciones i y s, debes usar $options para ambas:
{ name: { $regex: /acme.*corp/, $options: "si" } } { name: { $regex: 'acme.*corp', $options: "si" } }
PCRE frente a JavaScript
Para utilizar Para las funciones compatibles conPCRE en una expresión regular que no son compatibles con JavaScript, debe usar el $regex operador y especificar la expresión regular como una cadena.
Para coincidir cadenas sin distinguir entre mayúsculas y minúsculas:
"(?i)"inicia una coincidencia sin distinguir entre mayúsculas y minúsculas."(?-i)"termina una coincidencia que no distingue entre mayúsculas y minúsculas.
Por ejemplo, la expresión regular "(?i)a(?-i)cme" coincide con cadenas que:
Comienza con
"a"o"A". Esto es una coincidencia insensible a mayúsculas y minúsculas.Finalizar con
"cme". Esta es una coincidencia que distingue entre mayúsculas y minúsculas.
Estas cadenas coinciden con la expresión regular de ejemplo:
"acme""Acme"
El siguiente ejemplo utiliza el operador $regex para encontrar cadenas de campo name que coincidan con la expresión regular "(?i)a(?-i)cme":
{ name: { $regex: "(?i)a(?-i)cme" } }
A partir de la 6.1 versión, MongoDB utiliza la2 biblioteca PCRE (Perl Compatible Regular Expressions) para implementar la coincidencia de patrones de expresiones regulares. Para obtener más información sobre PCRE,2 consulte la documentación de PCRE.
$regex y $not
El operador$not puede realizar una operación lógica NOT en ambos:
Objetos de expresiones regulares (es decir,
/pattern/)Por ejemplo:
db.inventory.find( { item: { $not: /^p.*/ } } ) $regexexpresiones de operadorPor ejemplo:
db.inventory.find( { item: { $not: { $regex: "^p.*" } } } ) db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )
Uso del índice
El uso y el rendimiento de los índices para los query $regex varían según si el query distingue entre mayúsculas y minúsculas o no.
Los query que distinguen entre mayúsculas y minúsculas
Para los query de expresiones regulares que distinguen entre mayúsculas y minúsculas, si existe un índice para el campo, MongoDB compara la expresión regular con los valores del índice, lo que puede ser más rápido que un escaneo de colección.
Se puede lograr una mayor optimización si la expresión regular es una "expresión de prefijo", lo que significa que todas las coincidencias potenciales comienzan con la misma string. Esto permite a MongoDB construir un "rango" a partir de ese prefijo y solo coincidir con aquellos valores del índice que encajan dentro de ese rango.
Una expresión regular es una "expresión de prefijo" si comienza con un signo de intercalación (^) o un ancla izquierda (\A), seguido de un string de símbolos simples. Por ejemplo, la expresión regular /^abc.*/ se optimizará al coincidir solo con los valores del índice que comienzan con abc.
Además, aunque /^a/, /^a.*/ y /^a.*$/ coinciden con cadenas equivalentes, tienen diferentes características de rendimiento. Todas estas expresiones utilizan un índice si existe un índice apropiado; sin embargo, /^a.*/ y /^a.*$/ son más lentos. /^a/ puede dejar de escanear después de encontrar una coincidencia con el prefijo.
Los query que no detectan mayúsculas ni minúsculas
Los índices que distinguen entre mayúsculas y minúsculas no mejoran el rendimiento de los query $regex, ya que el operador $regex no es consciente de la intercalación y, por lo tanto, no puede aprovechar dichos índices.
Ejemplos
Los ejemplos de esta sección utilizan la siguiente colección products:
db.products.insertMany( [ { _id: 100, sku: "abc123", description: "Single line description." }, { _id: 101, sku: "abc789", description: "First line\nSecond line" }, { _id: 102, sku: "xyz456", description: "Many spaces before line" }, { _id: 103, sku: "xyz789", description: "Multiple\nline description" }, { _id: 104, sku: "Abc789", description: "SKU starts with A" } ] )
Realice una LIKE coincidencia
El siguiente ejemplo coincide con todos los documentos donde el campo sku es similar a "%789":
db.products.find( { sku: { $regex: /789$/ } } )
El ejemplo es análogo a la siguiente instrucción SQL LIKE:
SELECT * FROM products WHERE sku like "%789";
Ejemplo de salida:
[ { _id: 101, sku: 'abc789', description: 'First line\nSecond line' }, { _id: 103, sku: 'xyz789', description: 'Multiple\nline description' }, { _id: 104, sku: 'Abc789', description: 'SKU starts with A' } ]
Realizar una coincidencia de expresión regular sin distinguir entre mayúsculas y minúsculas
El siguiente ejemplo utiliza la opción i para realizar una coincidencia que no distingue entre mayúsculas y minúsculas para documentos con un valor sku que comienza con ABC.
db.products.find( { sku: { $regex: /^ABC/i } } )
Ejemplo de salida:
[ { _id: 100, sku: 'abc123', description: 'Single line description.' }, { _id: 101, sku: 'abc789', description: 'First line\nSecond line' }, { _id: 104, sku: 'Abc789', description: 'SKU starts with A' } ]
Coincidencia de múltiples líneas para líneas que comienzan con un patrón especificado
El siguiente ejemplo utiliza la opción m para coincidir líneas que comienzan con la letra S en cadenas de texto multilínea:
db.products.find( { description: { $regex: /^S/, $options: 'm' } } )
Ejemplo de salida:
[ { _id: 100, sku: 'abc123', description: 'Single line description.' }, { _id: 101, sku: 'abc789', description: 'First line\nSecond line' }, { _id: 104, sku: 'Abc789', description: 'SKU starts with A' } ]
Sin la opción m, el resultado de ejemplo es:
[ { _id: 100, sku: 'abc123', description: 'Single line description.' }, { _id: 104, sku: 'Abc789', description: 'SKU starts with A' } ]
Si el patrón $regex no contiene un ancla, el patrón coincide con el string en su totalidad, como en el siguiente ejemplo:
db.products.find( { description: { $regex: /S/ } } )
Ejemplo de salida:
[ { _id: 100, sku: 'abc123', description: 'Single line description.' }, { _id: 101, sku: 'abc789', description: 'First line\nSecond line' }, { _id: 104, sku: 'Abc789', description: 'SKU starts with A' } ]
Utiliza el . Caracter de punto para hacer coincidir una nueva línea
El siguiente ejemplo utiliza la opción s para permitir el carácter punto (es decir, .) para que coincidan todos los caracteres incluyendo la nueva línea, así como la opción i para realizar una coincidencia sin distinguir entre mayúsculas y minúsculas:
db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )
Ejemplo de salida:
[ { _id: 102, sku: 'xyz456', description: 'Many spaces before line' }, { _id: 103, sku: 'xyz789', description: 'Multiple\nline description' } ]
Sin la opción s, el resultado de ejemplo es:
[ { _id: 102, sku: 'xyz456', description: 'Many spaces before line' } ]
Ignorar los espacios en blanco en el patrón
El siguiente ejemplo utiliza la opción x para ignorar los espacios en blanco y los comentarios, indicados por el # y que terminan con el \n en el patrón de coincidencia:
var pattern = "abc #category code\n123 #item number" db.products.find( { sku: { $regex: pattern, $options: "x" } } )
Ejemplo de salida:
[ { _id: 100, sku: 'abc123', description: 'Single line description.' } ]
Utiliza una expresión regular para coincidir con mayúsculas y minúsculas en las cadenas
El siguiente ejemplo utiliza la expresión regular "(?i)a(?-i)bc" para coincidir con las cadenas de campo sku que contienen:
"abc""Abc"
db.products.find( { sku: { $regex: "(?i)a(?-i)bc" } } )
Ejemplo de salida:
[ { _id: 100, sku: 'abc123', description: 'Single line description.' }, { _id: 101, sku: 'abc789', description: 'First line\nSecond line' }, { _id: 104, sku: 'Abc789', description: 'SKU starts with A' } ]
Extiende las opciones de Regex para que coincidan con caracteres fuera de ASCII
Nuevo en la versión 6.1.
Por defecto, ciertas opciones de expresiones regulares (como /b y /w) solo reconocen caracteres ASCII. Esto puede causar resultados inesperados al realizar coincidencias de regex con caracteres UTF-8.
A partir de MongoDB 6.1, puede especificar la opción *UCP de regex para que coincida con caracteres UTF-8.
Importante
Rendimiento de la opción UCP
La opción *UCP da como resultado query más lentos que aquellos sin la opción especificada, porque *UCP requiere una búsqueda en tabla de múltiples etapas para realizar la coincidencia.
Por ejemplo, considere los siguientes documentos en una colección songs:
db.songs.insertMany( [ { _id: 0, "artist" : "Blue Öyster Cult", "title": "The Reaper" }, { _id: 1, "artist": "Blue Öyster Cult", "title": "Godzilla" }, { _id: 2, "artist" : "Blue Oyster Cult", "title": "Take Me Away" } ] )
El siguiente query de expresiones regulares utiliza la opción \b en una coincidencia de regex. La opción \b coincide con un límite de palabra.
db.songs.find( { artist: { $regex: /\byster/ } } )
Ejemplo de salida:
[ { _id: 0, artist: 'Blue Öyster Cult', title: 'The Reaper' }, { _id: 1, artist: 'Blue Öyster Cult', title: 'Godzilla' } ]
Los resultados anteriores son inesperados porque ninguna de las palabras en los campos artist devueltos comienza con la string coincidente (yster). El carácter Ö en los documentos _id: 0 y _id: 1 se ignora al realizar la coincidencia porque es un carácter UTF-8.
El resultado previsto es que el query no devuelva ningún documento.
Para permitir que el query reconozca los caracteres UTF-8, especifica la opción *UCP antes del patrón:
db.songs.find( { artist: { $regex: "(*UCP)/\byster/" } } )
El query anterior no devuelve ningún documento, lo cual es el resultado esperado.
Tip
Caracteres de escape para patrones Regex
Al especificar *UCP u otra opción de expresión regular, asegúrate de usar los caracteres de escape correctos para el shell o controlador.