Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$regex (operador de predicado de query)

Nota

Esta página describe las capacidades de búsqueda con expresiones regulares para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB, MongoDB también ofrece una solución mejorada de búsqueda de texto completo, MongoDB Search, que tiene su propio $regex operador. Para obtener más información, consulta $regex en la documentación de MongoDB Search.

$regex

Proporciona capacidades de expresiones regulares para la coincidencia de patrones en cadenas dentro de los query.

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.

Utilice una de las siguientes variaciones de sintaxis:

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ "<field>": { "$regex": "pattern", "$options": "<options>" } }
{ <field>: { $regex: /pattern/<options> } }

Nota

Para usar $regex con, encierre el documento de consulta entre comillas simples ('{... }') para asegurarse de que no interactúe con el mongodump 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"}}'

También puede utilizar objetos de expresiones regulares (/pattern/) para especificar expresiones regulares:

{ <field>: /pattern/<options> }

Para conocer las restricciones en el uso de la sintaxis, consulte la sintaxis de $regex frente a /pattern/.

$options

Los siguientes <options> están disponibles para expresiones regulares:

Opción
Descripción

i

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.

m

Para patrones que incluyen anclas (^ para el inicio, $ para el final), se realiza la coincidencia al principio o al final de cada línea para cadenas con valores multilínea. Sin esta opción, estas anclas se realizan al principio o al final de la cadena. Para ver un ejemplo, consulte Coincidencia multilínea para líneas que comienzan con un patrón especificado.

Si el patrón no tiene anclas o si el valor de la cadena no tiene caracteres de nueva línea (por ejemplo, \n), la opción m no tiene ningún efecto.

x

Capacidad “extendida” para ignorar todos los caracteres de espacio en blanco en el patrón $regex a menos que se escapen o se incluyan en una clase de caracteres.

Además, ignora los caracteres entre un carácter de hash/pound (#) sin escape y la siguiente nueva línea, para que pueda incluir comentarios en patrones complicados. Esto solo se aplica a los caracteres de datos; los caracteres de espacio en blanco nunca deben aparecer dentro de las secuencias de caracteres especiales en un patrón.

La opción x no afecta al manejo del carácter VT (código 11).

s

Permite que el carácter de punto. () coincida con todos los caracteres, incluidos los de salto de línea. Para ver un ejemplo, consulte Usar el . carácter de punto para coincidir con un salto de línea.

u

Opción Unicode, que es aceptada pero redundante. UTF está habilitado por defecto para $regex.

Nota

$regex no admite el modificador de búsqueda global g.

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.

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' ] } }

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" } }

Para utilizar Las características de una expresión regular compatibles conPCRE que no son compatibles con JavaScript, utilizan el $regex operador y especifican el patrón 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 versión 6.1, MongoDB utiliza la librería PCRE2 (Expresiones regulares compatibles con Perl) para implementar la coincidencia de patrones de expresiones regulares. Para obtener más información sobre PCRE2, consulta la Documentación de PCRE.

El operador puede realizar $not una NOT operación lógica en ambos:

  • Objetos de expresiones regulares (/pattern/)

    Por ejemplo:

    db.inventory.find( { item: { $not: /^p.*/ } } )
  • $regex expresiones de operador

    Por ejemplo:

    db.inventory.find( { item: { $not: { $regex: "^p.*" } } } )
    db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )

El uso del índice y el rendimiento para las consultas $regex dependen de si la consulta distingue entre mayúsculas y minúsculas o no.

Para consultas 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. Esto 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 cadena. Esto permite que MongoDB construya un "rango" a partir de ese prefijo y solo haga coincidir los valores del índice dentro del rango especificado.

Una expresión regular es una "expresión de prefijo" si comienza con un circunflejo (^) o un ancla izquierda (\A), seguido de una cadena de símbolos simples. Por ejemplo, la expresión regular /^abc.*/ está optimizada para coincidir solo con los valores del índice que comienzan con abc.

Además, aunque /^a/, /^a.*/ y /^a.*$/ coinciden con cadenas equivalentes, presentan características de rendimiento diferentes. Todas estas expresiones utilizan un índice si existe uno adecuado. Sin embargo, /^a.*/ y /^a.*$/ son más lentas. /^a/ puede detener el escaneo tras coincidir con el prefijo.

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.

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" }
] )

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 similar 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' }
]

El siguiente ejemplo utiliza la opción i para realizar una coincidencia que no distingue entre mayúsculas y minúsculas para los valores sku que comienzan 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' }
]

Utilice el ancla de límite de palabra \b para que coincida únicamente con palabras completas. Un límite de palabra coincide con la posición entre un carácter de palabra y un carácter que no es de palabra, o al principio o al final de una cadena.

El siguiente ejemplo coincide con documentos donde el campo description contiene la palabra line como palabra completa, pero no como parte de otra palabra como multiline:

db.products.find( { description: { $regex: /\bline\b/ } } )
[
{ _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' }
]

MongoDB no devuelve el documento con _id: 103 porque su campo description contiene line solo como parte de la palabra Multiple\nline. El \n (salto de línea) actúa como límite de palabra para la segunda aparición.

Nota

Para hacer coincidir los límites de las palabras con8 caracteres UTF-,consulte Ampliar las opciones de expresiones regulares para hacer coincidir caracteres fuera de ASCII.

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 toda la cadena. Por 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' }
]

El siguiente ejemplo utiliza la s opción para permitir que el carácter de punto. () coincida con todos los caracteres,incluido el salto de línea, y la i opción para realizar una coincidencia que no distinga 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, la consulta devuelve:

[
{ _id: 102, sku: 'xyz456', description: 'Many spaces before line' }
]

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.' }
]

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' }
]

Nuevo en la versión 6.1.

Por defecto, algunas opciones de expresiones regulares (como /b y /w) solo reconocen caracteres ASCII. Esto puede provocar resultados inesperados al realizar coincidencias de expresiones regulares 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 completas en los campos artist devueltos comienza con la cadena 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 esperado es que la consulta 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/" } } )

La consulta anterior no devuelve ningún documento, que es el resultado esperado porque ninguna de las palabras completas en los campos artist comienza con la cadena yster.

Tip

Caracteres de escape para patrones Regex

Al especificar *UCP o cualquier otra opción de expresión regular, utilice los caracteres de escape correctos para su shell o controlador.

Volver

$mod

En esta página