Definición
Sintaxis
El operador tiene la siguiente $regexMatch sintaxis:
{ $regexMatch: { input: <expression> , regex: <expression>, options: <expression> } }
Campo | Descripción | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
La cadena a la que desea aplicar el patrón de expresión regular. Puede ser una cadena o cualquier expresión válida que se resuelva en una cadena. | |||||||||||
El patrón regex a aplicar. Puede ser cualquier expresión válida que se resuelva en una string o patrón regex
Alternativamente, también puede especificar las opciones de expresiones regulares con el campo de opciones. Para especificar las No se pueden especificar opciones tanto en el campo | |||||||||||
Opcional. Los siguientes No se pueden especificar opciones tanto en el campo
|
Devuelve
El operador retorna un valor booleano:
truesi existe una coincidencia.falsesi no existe una coincidencia.
Comportamiento
librería PCRE
A partir de la versión 6.1, MongoDB utiliza la librería PCRE2 (Perl Compatible Regular Expressions) para implementar la coincidencia de patrones de expresiones regulares. Para obtener más información sobre PCRE2, consulta la documentación de PCRE.
$regexMatch e intercalación
String matching para $regexMatch siempre distingue entre mayúsculas y minúsculas, y es sensible a las marcas diacríticas. $regexMatch ignora la intercalación especificada para la colección, db.collection.aggregate(), y el índice, si se utiliza.
Por ejemplo, crear una colección con una fuerza de intercalación 1, lo que significa que la intercalación solo compara caracteres base y no toma en cuenta diferencias como mayúsculas y diacríticos:
db.createCollection( "restaurants", { collation: { locale: "fr", strength: 1 } } )
Inserte los siguientes documentos:
db.restaurants.insertMany( [ { _id: 1, category: "café", status: "Open" }, { _id: 2, category: "cafe", status: "open" }, { _id: 3, category: "cafE", status: "open" } ] )
Lo siguiente utiliza la intercalación de la colección para realizar una coincidencia sin distinción entre mayúsculas y minúsculas y sin sensibilidad a los signos diacríticos:
db.restaurants.aggregate( [ { $match: { category: "cafe" } } ] )
[ { _id: 1, category: 'café', status: 'Open' }, { _id: 2, category: 'cafe', status: 'open' }, { _id: 3, category: 'cafE', status: 'open' } ]
Sin embargo, $regexMatch ignora la intercalación. Los siguientes ejemplos de coincidencias de patrones de expresiones regulares distinguen entre mayúsculas y minúsculas y entre diacríticos:
db.restaurants.aggregate( [ { $addFields: { resultObject: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ] ) db.restaurants.aggregate( [ { $addFields: { resultObject: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ], { collation: { locale: "fr", strength: 1 } } // Ignored in the $regexMatch )
Ambas operaciones devuelven lo siguiente:
{ "_id" : 1, "category" : "café", "resultObject" : null } { "_id" : 2, "category" : "cafe", "resultObject" : { "match" : "cafe", "idx" : 0, "captures" : [ ] } } { "_id" : 3, "category" : "cafE", "resultObject" : null }
Debido a que la query ignora la intercalación, requiere una coincidencia exacta en la string category (incluyendo mayúsculas y signos diacríticos), lo que significa que solo se empareja el documento _id: 2.
Para realizar una coincidencia de patrones de expresiones regulares sin distinción entre mayúsculas y minúsculas, utilice la opción.i Consulte i la opción para ver un ejemplo.
Ejemplos
$regexMatch y sus opciones
Para ilustrar el comportamiento del operador como se explica en este ejemplo, cree una colección de $regexMatch muestra products con los siguientes documentos:
db.products.insertMany([ { _id: 1, description: "Single LINE description." }, { _id: 2, description: "First lines\nsecond line" }, { _id: 3, description: "Many spaces before line" }, { _id: 4, description: "Multiple\nline descriptions" }, { _id: 5, description: "anchors, links and hyperlinks" }, { _id: 6, description: "métier work vocation" } ])
Por defecto, realiza una coincidencia sensible a mayúsculas y$regexMatch minúsculas. Por ejemplo, la siguiente agregación realiza una sensible a mayúsculas $regexMatch y minúsculas en el description campo. El patrón de expresión regular /line/ no especifica ninguna agrupación:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /line/ } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "result" : false } { "_id" : 2, "description" : "First lines\nsecond line", "result" : true } { "_id" : 3, "description" : "Many spaces before line", "result" : true } { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true } { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false } { "_id" : 6, "description" : "métier work vocation", "result" : false }
El siguiente patrón de expresiones regulares /lin(e|k)/ especifica una agrupación (e|k) en el patrón:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /lin(e|k)/ } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "result" : false } { "_id" : 2, "description" : "First lines\nsecond line", "result" : true } { "_id" : 3, "description" : "Many spaces before line", "result" : true } { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true } { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : true } { "_id" : 6, "description" : "métier work vocation", "result" : false }
i Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el options.
Para realizar una concordancia de patronessin distinguir mayúsculas de minúsculas, incluya la opción i como parte del campo regex o en el campo opciones:
// Specify i as part of the regex field { $regexMatch: { input: "$description", regex: /line/i } } // Specify i in the options field { $regexMatch: { input: "$description", regex: /line/, options: "i" } } { $regexMatch: { input: "$description", regex: "line", options: "i" } }
Por ejemplo, la siguiente agregación realiza una operación sindistinción entre mayúsculas $regexMatch y minúsculas en el description campo. El patrón de expresión regular /line/ no especifica ninguna agrupación:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /line/i } } } } ])
La operación devuelve los siguientes documentos:
{ "_id" : 1, "description" : "Single LINE description.", "result" : true } { "_id" : 2, "description" : "First lines\nsecond line", "result" : true } { "_id" : 3, "description" : "Many spaces before line", "result" : true } { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true } { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false } { "_id" : 6, "description" : "métier work vocation", "result" : false }
m Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el options.
Para que coincida con los anclajes especificados (por ejemplo, ^, $) para cada línea de una string multilínea, incluya la opción m como parte del campo regex o en el campo opciones:
// Specify m as part of the regex field { $regexMatch: { input: "$description", regex: /line/m } } // Specify m in the options field { $regexMatch: { input: "$description", regex: /line/, options: "m" } } { $regexMatch: { input: "$description", regex: "line", options: "m" } }
El siguiente ejemplo incluye tanto las opciones i como m para hacer coincidir las líneas que comienzan con la letra s o S en cadenas multilínea:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /^s/im } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "result" : true } { "_id" : 2, "description" : "First lines\nsecond line", "result" : true } { "_id" : 3, "description" : "Many spaces before line", "result" : false } { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : false } { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false } { "_id" : 6, "description" : "métier work vocation", "result" : false }
x Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el options.
Para ignorar todos los caracteres de espacio en blanco y comentarios sin escape (denotados por el carácter hash # sin escape y el siguiente carácter de nueva línea) en el patrón, incluya la opción s en el campo de opciones:
// Specify x in the options field { $regexMatch: { input: "$description", regex: /line/, options: "x" } } { $regexMatch: { input: "$description", regex: "line", options: "x" } }
El siguiente ejemplo incluye la opción x para omitir los espacios en blanco sin escape y los comentarios:
db.products.aggregate([ { $addFields: { returns: { $regexMatch: { input: "$description", regex: /lin(e|k) # matches line or link/, options:"x" } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returns" : false } { "_id" : 2, "description" : "First lines\nsecond line", "returns" : true } { "_id" : 3, "description" : "Many spaces before line", "returns" : true } { "_id" : 4, "description" : "Multiple\nline descriptions", "returns" : true } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returns" : true } { "_id" : 6, "description" : "métier work vocation", "returns" : false }
s Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el options.
Para permitir el carácter de punto (es decir, .) en el patrón para hacer coincidir todos los caracteres, incluido el carácter de nueva línea, incluye la opción s en el campo opciones:
// Specify s in the options field { $regexMatch: { input: "$description", regex: /m.*line/, options: "s" } } { $regexMatch: { input: "$description", regex: "m.*line", options: "s" } }
El siguiente ejemplo incluye la opción s para permitir que el carácter de punto (es decir, .) coincida con todos los caracteres, incluyendo la nueva línea, así como la opción i para realizar una coincidencia sin distinción entre mayúsculas y minúsculas:
db.products.aggregate([ { $addFields: { returns: { $regexMatch: { input: "$description", regex:/m.*line/, options: "si" } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returns" : false } { "_id" : 2, "description" : "First lines\nsecond line", "returns" : false } { "_id" : 3, "description" : "Many spaces before line", "returns" : true } { "_id" : 4, "description" : "Multiple\nline descriptions", "returns" : true } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returns" : false } { "_id" : 6, "description" : "métier work vocation", "returns" : false }
Usa $regexMatch para comprobar dirección de correo electrónico
Cree una colección de muestra feedback con los siguientes documentos:
db.feedback.insertMany([ { "_id" : 1, comment: "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com" }, { "_id" : 2, comment: "I wanted to concatenate a string" }, { "_id" : 3, comment: "How do I convert a date to string? Contact me at either cam@mongodb.com or c.dia@mongodb.com" }, { "_id" : 4, comment: "It's just me. I'm testing. fred@MongoDB.com" } ])
La siguiente agregación utiliza el para comprobar si $regexMatch el comment campo contiene una dirección de correo electrónico con @mongodb.com y categorizar los comentarios como Employee Externalo.
db.feedback.aggregate( [ { $addFields: { "category": { $cond: { if: { $regexMatch: { input: "$comment", regex: /[a-z0-9_.+-]+@mongodb.com/i } }, then: "Employee", else: "External" } } } },
La operación devuelve los siguientes documentos:
{ "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "category" : "External" } { "_id" : 2, "comment" : "I wanted to concatenate a string", "category" : "External" } { "_id" : 3, "comment" : "How do I convert a date to string? Contact me at either cam@mongodb.com or c.dia@mongodb.com", "category" : "Employee" } { "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "category" : "Employee" }