Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$regex (operador de predicado de query)

Nota

Esta página describe las capacidades de búsqueda por 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, Búsqueda Atlas, que tiene su propio $regex operador. Para obtener más información, consulta $regex en la documentación de Atlas 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.

Utiliza una de las siguientes variaciones sintácticas:

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

Nota

Para usar $regex con mongodump, encierra el documento de query entre comillas simples ('{ ... }') para asegurarte de que no interactúe con el 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 puedes usar objetos de expresión regular (/pattern/) para especificar expresiones regulares:

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

Para las restricciones sobre el uso de la sintaxis, véase $regex vs. /pattern/ Syntax.

$options

Las 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 los patrones que incluyen anclajes (^ para el inicio, $ para el final), se corresponde con el inicio o el final de cada línea para los strings con valores multilínea. Sin esta opción, estos anclajes coinciden al inicio o al final de la string. Para un ejemplo, consulte Coincidencia de múltiples líneas para líneas que comienzan con un patrón específico.

Si el patrón no tiene anclas o si el valor de la string 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 la gestión del carácter VT (código 11).

s

Permite que el carácter punto (.) coincida con todos los caracteres, incluidos los caracteres de nueva línea. Para obtener un ejemplo, consulte Usar el carácter punto . para combinar con una nueva línea.

u

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

Nota

$regex no es compatible con 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 usar PCRE-Las funcionalidades admitidas en una expresión regular que no están disponibles en JavaScript, se puede utilizar el operador $regex y especificar el patrón como un string.

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 $not puede realizar una operación lógica NOT 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 y rendimiento del índice para consultas $regex depende de si la consulta distingue entre mayúsculas y minúsculas o no.

Para las consultas de expresiones regulares que distinguen entre mayúsculas y minúsculas, si existe un índice para el campo, entonces MongoDB compara la expresión regular con los valores en el índice. Esto puede ser más rápido que un escaneo de colección.

Una mayor optimización puede ocurrir si la expresión regular es una "expresión prefijo", lo que significa que todas las coincidencias potenciales comienzan con la misma string. Esto permite que MongoDB construya un "rango" a partir de ese prefijo y solo coincida con valores del índice dentro del rango especificado.

Una expresión regular es una "expresión de prefijo" si comienza con un símbolo de intercalación (^) o un ancla izquierda (\A), seguido de un string de símbolos simples. Por ejemplo, el regex /^abc.*/ está optimizado para hacer coincidir solo 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 un índice apropiado. Sin embargo, /^a.*/, y /^a.*$/ son más lentos. /^a/ puede dejar de escanear después de hacer coincidir 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 LIKE de SQL:

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

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 se empareja con toda la string. 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 opción s para permitir que el carácter punto (.) coincida con todos los caracteres incluyendo la nueva línea, y la opción i para realizar una coincidencia sin distinción 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 query 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 los caracteres ASCII. Esto puede causar resultados inesperados al realizar coincidencias con expresiones regulares para 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 previos son inesperados porque ninguna de las palabras completas 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 comparación porque Ö es un carácter UTF-8.

El resultado esperado es que la 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/" } } )

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 string yster.

Tip

Caracteres de escape para patrones Regex

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

Volver

$mod

En esta página