Definición
Sintaxis
El operador $regexMatch tiene la siguiente sintaxis:
{ $regexMatch: { input: <expression> , regex: <expression>, options: <expression> } }
Campo | Descripción | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
La cadena a la que se 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 de expresión regular que se aplicará. Puede ser cualquier expresión válida que se resuelva en una cadena o en el patrón de expresión
Como alternativa, también puede especificar las opciones de expresiones regulares con el campo de opciones. Para especificar las No se pueden especificar opciones en el campo | |||||||||||
Opcional. Los siguientes No se pueden especificar opciones en el campo
|
Devuelve
El operador devuelve un valor booleano:
truesi existe una coincidencia.falseSi no existe ninguna coincidencia.
Comportamiento
$regexMatch y intercalación
La coincidencia de cadenas $regexMatch para siempre distingue entre mayúsculas y minúsculas y signos diacríticos. $regexMatch ignora la intercalación especificada para la colección,, y el índice, si sedb.collection.aggregate() utiliza.
Por ejemplo, cree una colección con un nivel de intercalación de 1, lo que significa que la intercalación solo compara caracteres base e ignora diferencias como mayúsculas y minú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" } ] )
A continuación se utiliza la intercalación de la colección para realizar una coincidencia que no distingue entre mayúsculas y minúsculas ni entre 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 consulta ignora la intercalación, requiere una coincidencia exacta en la cadena category (incluyendo mayúsculas y minúsculas y tildes), lo que significa que solo coincide con el documento _id: 2.
Para realizar una coincidencia de patrones de expresiones regulares sin distinguir entre mayúsculas y minúsculas, utilice la opción. Consulte la i i opción para ver un ejemplo.
Ejemplos
$regexMatch y sus opciones
Para ilustrar el comportamiento del operador como se analiza 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" } ])
De forma predeterminada, realiza una coincidencia que distingue entre mayúsculas y minúsculas. $regexMatch Por ejemplo, la siguiente agregación realiza una que distingue entre mayúsculas y $regexMatch 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 expresión regular /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 en el campo regex y en el campo options.
Para realizar una coincidencia de patrones sindistinguir entre mayúsculas y minúsculas, incluya la opción i como parte del campo de expresión regular o en el campo de 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 agregació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 en el campo regex y en el campo options.
Para que coincidan los anclajes especificados (por^ $ejemplo,,) para cada línea de una cadena de varias líneas, incluya la opción m como parte del campo de expresión regular o en el campo de 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 las opciones i y m para hacer coincidir líneas que comiencen con la letra s o S para cadenas de varias líneas:
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 en el campo regex y en el campo options.
Para ignorar todos los caracteres de espacio en blanco sin escapar y los comentarios (indicados por el # carácter almohadilla sin escapar 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 espacios en blanco y comentarios sin escape:
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 en el campo regex y en el campo options.
Para permitir que el carácter de punto (es. decir,) en el patrón coincida con todos los caracteres, incluido el carácter de nueva línea, incluya la opción s en el campo de 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, incluida la nueva línea, así como la opción i para realizar una coincidencia sin distinguir 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 }
Utilice $regexMatch para comprobar la 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 para verificar si $regexMatch el comment campo contiene una dirección de correo electrónico con @mongodb.com y categoriza 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" }