Docs Menu
Docs Home
/ /

$regex

Nota

Esta página describe las funciones de búsqueda de 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 propia $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.

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.

$options

Los siguientes <options> están disponibles para su uso con 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 anclajes (es decir, ^ para el inicio, $ para el final), haz coincidir al principio o al final de cada línea para strings con valores de varias líneas. Sin esta opción, estos anclajes coinciden al principio o al final del string. Para ver un ejemplo, consulta Coincidencia multilínea para líneas que comienzan con un patrón especificado.

Si el patrón no contiene anclas o si el valor de la string no tiene caracteres de nueva línea (p. ej., \n), la opción m no tiene 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 el manejo del carácter VT (es decir, código 11).

s

Permite el carácter punto (es decir, .) para que coincidan todos los caracteres incluidos los caracteres de salto de línea. Para ver un ejemplo, consulta Usa el carácter de punto . para hacer coincidir la nueva línea.

u

Admite Unicode. Este indicador se acepta, pero es redundante. UTF se establece por defecto en el operador $regex, lo que hace innecesaria la opción u.

Nota

El operador $regex no brinda soporte para 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 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.

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.*/ } } )
  • $regex expresiones de operador

    Por ejemplo:

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

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.

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

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

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

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

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

Volver

$mod

En esta página