Definición
Sintaxis
El operador $regexFind tiene la siguiente sintaxis:
{ $regexFind: { input: <expression> , regex: <expression>, options: <expression> } }
Campos de operadores
Campo | Descripción |
|---|---|
La string a la que deseas aplicar el patrón regex. Puede ser un string o cualquier expresión válida que se resuelva en un string. | |
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 puedes especificar las opciones de regex en el campo opciones. Para especificar las opciones No se pueden especificar opciones tanto en el campo | |
Opcional. Los siguientes No se pueden especificar opciones tanto en el campo
|
Devuelve
Si el operador no encuentra coincidencias, el resultado del operador es un null.
Si el operador encuentra una coincidencia, el resultado del operador es un documento que contiene:
la primera cadena coincidente en la entrada,
{ "match" : <string>, "idx" : <num>, "captures" : <array of strings> }
Comportamiento
librería PCRE
A partir de la versión 6.1, MongoDB utiliza la biblioteca PCRE2 (Perl Compatible Regular Expressions) para implementar la coincidencia de patrones mediante expresiones regulares. Para obtener más información sobre PCRE2, consulte la documentación de PCRE.
$regexFind y intercalación
String matching para $regexFind siempre distingue entre mayúsculas y minúsculas, y es sensible a las marcas diacríticas. $regexFind 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, $regexFind 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: { $regexFind: { input: "$category", regex: /cafe/ } } } } ] ) db.restaurants.aggregate( [ { $addFields: { resultObject: { $regexFind: { input: "$category", regex: /cafe/ } } } } ], { collation: { locale: "fr", strength: 1 } } // Ignored in the $regexFind )
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 la opción i para ver un ejemplo.
captures Comportamiento de la salida
Si su patrón de expresión regular contiene grupos de captura y encuentra una coincidencia en la entrada, el array captures en los resultados corresponde a los grupos capturados por la cadena coincidente. Los grupos de captura se especifican con paréntesis sin escape () en el patrón de expresión regular. La longitud del array captures es igual al número de grupos de captura en el patrón y el orden del array coincide con el orden en que aparecen los grupos de captura.
Crea una colección de muestra llamada contacts con los siguientes documentos:
db.contacts.insertMany([ { "_id": 1, "fname": "Carol", "lname": "Smith", "phone": "718-555-0113" }, { "_id": 2, "fname": "Daryl", "lname": "Doe", "phone": "212-555-8832" }, { "_id": 3, "fname": "Polly", "lname": "Andrews", "phone": "208-555-1932" }, { "_id": 4, "fname": "Colleen", "lname": "Duncan", "phone": "775-555-0187" }, { "_id": 5, "fname": "Luna", "lname": "Clarke", "phone": "917-555-4414" } ])
La siguiente secuencia de comandos aplica el patrón de expresión regular /(C(ar)*)ol/ al campo fname:
db.contacts.aggregate([ { $project: { returnObject: { $regexFind: { input: "$fname", regex: /(C(ar)*)ol/ } } } } ])
El patrón de expresión regular encuentra una coincidencia con los valores Carol y Colleen de fname:
{ "_id" : 1, "returnObject" : { "match" : "Carol", "idx" : 0, "captures" : [ "Car", "ar" ] } } { "_id" : 2, "returnObject" : null } { "_id" : 3, "returnObject" : null } { "_id" : 4, "returnObject" : { "match" : "Col", "idx" : 0, "captures" : [ "C", null ] } } { "_id" : 5, "returnObject" : null }
El patrón contiene el grupo de captura (C(ar)*), que a su vez contiene el grupo anidado (ar). Los elementos del array captures corresponden a los dos grupos de captura. Si un documento coincidente no es capturado por un grupo (por ejemplo, Colleen y el grupo (ar)), $regexFind reemplaza el grupo con un marcador de posición nulo.
Como se muestra en el ejemplo anterior, el arreglo captures contiene un elemento para cada grupo de captura (utilizando null para los que no son de captura). Considere el siguiente ejemplo que busca números de teléfono con códigos de área de la ciudad de Nueva York aplicando un or lógico de grupos de captura al campo phone. Cada grupo representa un código de área de la Ciudad de Nueva York:
db.contacts.aggregate([ { $project: { nycContacts: { $regexFind: { input: "$phone", regex: /^(718).*|^(212).*|^(917).*/ } } } } ])
Para los documentos que coinciden con el patrón de expresión regular, la matriz captures incluye el grupo de captura coincidente y reemplaza cualquier grupo que no sea de captura con null:
{ "_id" : 1, "nycContacts" : { "match" : "718-555-0113", "idx" : 0, "captures" : [ "718", null, null ] } } { "_id" : 2, "nycContacts" : { "match" : "212-555-8832", "idx" : 0, "captures" : [ null, "212", null ] } } { "_id" : 3, "nycContacts" : null } { "_id" : 4, "nycContacts" : null } { "_id" : 5, "nycContacts" : { "match" : "917-555-4414", "idx" : 0, "captures" : [ null, null, "917" ] } }
Ejemplos
$regexFind y sus opciones
Para ilustrar el comportamiento del operador $regexFind tal como se analiza en este ejemplo, cree una colección de 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, $regexFind realiza una coincidencia que distingue entre mayúsculas y minúsculas. Por ejemplo, la siguiente agregación realiza una $regexFind que distingue entre mayúsculas y minúsculas en el campo description. El patrón de expresión regular /line/ no especifica ninguna agrupación:
db.products.aggregate([ { $addFields: { returnObject: { $regexFind: { input: "$description", regex: /line/ } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ ] } } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ ] } } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ ] } } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null } { "_id" : 6, "description" : "métier work vocation", "returnObject" : null }
El siguiente patrón de expresiones regulares /lin(e|k)/ especifica una agrupación (e|k) en el patrón:
db.products.aggregate([ { $addFields: { returnObject: { $regexFind: { input: "$description", regex: /lin(e|k)/ } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ "e" ] } } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ "e" ] } } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ "e" ] } } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : { "match" : "link", "idx" : 9, "captures" : [ "k" ] } } { "_id" : 6, "description" : "métier work vocation", "returnObject" : null }
En la opción de retorno, el campo idx es el índice del punto de código y no el índice del byte. Para ilustrarlo, considere el siguiente ejemplo que utiliza el patrón de expresión regular /tier/:
db.products.aggregate([ { $addFields: { returnObject: { $regexFind: { input: "$description", regex: /tier/ } } } } ])
La operación devuelve lo siguiente, donde solo el último registro coincide con el patrón y el idx devuelto es 2 (en lugar de 3 si se utiliza un índice de bytes).
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : null } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : null } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : null } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null } { "_id" : 6, "description" : "métier work vocation", "returnObject" : { "match" : "tier", "idx" : 2, "captures" : [ ] } }
i Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el options.
Para realizar una coincidencia de patrones que no distinga 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 { $regexFind: { input: "$description", regex: /line/i } } // Specify i in the options field { $regexFind: { input: "$description", regex: /line/, options: "i" } } { $regexFind: { input: "$description", regex: "line", options: "i" } }
Por ejemplo, la siguiente agregación realiza una operación $regexFind sin distinción entre mayúsculas y minúsculas en el campo description. El patrón de expresión regular /line/ no especifica ninguna agrupación:
db.products.aggregate([ { $addFields: { returnObject: { $regexFind: { input: "$description", regex: /line/i } } } } ])
La operación devuelve los siguientes documentos:
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : { "match" : "LINE", "idx" : 7, "captures" : [ ] } } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ ] } } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ ] } } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ ] } } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null } { "_id" : 6, "description" : "métier work vocation", "returnObject" : null }
m Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el options.
Para que coincidan las anclas especificadas (por ejemplo, ^, $) para cada línea de una cadena multilinea, 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 { $regexFind: { input: "$description", regex: /line/m } } // Specify m in the options field { $regexFind: { input: "$description", regex: /line/, options: "m" } } { $regexFind: { 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: { returnObject: { $regexFind: { input: "$description", regex: /^s/im } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : { "match" : "S", "idx" : 0, "captures" : [ ] } } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "s", "idx" : 12, "captures" : [ ] } } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : null } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : null } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null } { "_id" : 6, "description" : "métier work vocation", "returnObject" : null }
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 sin escape y los comentarios (indicados por el carácter de almohadilla # 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 { $regexFind: { input: "$description", regex: /line/, options: "x" } } { $regexFind: { 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: { returnObject: { $regexFind: { input: "$description", regex: /lin(e|k) # matches line or link/, options:"x" } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ "e" ] } } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ "e" ] } } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ "e" ] } } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : { "match" : "link", "idx" : 9, "captures" : [ "k" ] } } { "_id" : 6, "description" : "métier work vocation", "returnObject" : null }
s Opción
Nota
No se pueden especificar opciones tanto en el campo regex como en el 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 { $regexFind: { input: "$description", regex: /m.*line/, options: "s" } } { $regexFind: { 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: { returnObject: { $regexFind: { input: "$description", regex:/m.*line/, options: "si" } } } } ])
La operación devuelve lo siguiente:
{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null } { "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : null } { "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "Many spaces before line", "idx" : 0, "captures" : [ ] } } { "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "Multiple\nline", "idx" : 0, "captures" : [ ] } } { "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null } { "_id" : 6, "description" : "métier work vocation", "returnObject" : null }
Utiliza $regexFind para analizar correos electrónicos de una string
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? cam@mongodb.com" }, { "_id" : 4, comment: "It's just me. I'm testing. fred@MongoDB.com" } ])
La siguiente agregación utiliza el campo $regexFind para extraer el correo electrónico del campo comment (sin distinción entre mayúsculas y minúsculas).
db.feedback.aggregate( [ { $addFields: { "email": { $regexFind: { input: "$comment", regex: /[a-z0-9_.+-]+@[a-z0-9_.+-]+\.[a-z0-9_.+-]+/i } } } }, { $set: { email: "$email.match"} } ] )
- Primera etapa
La etapa utiliza la etapa
$addFieldspara agregar un nuevo campoemailal documento. El nuevo campo contiene el resultado de realizar la operación$regexFinden el campocomment:{ "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "email" : { "match" : "aunt.arc.tica@example.com", "idx" : 38, "captures" : [ ] } } { "_id" : 2, "comment" : "I wanted to concatenate a string", "email" : null } { "_id" : 3, "comment" : "I can't find how to convert a date to string. cam@mongodb.com", "email" : { "match" : "cam@mongodb.com", "idx" : 46, "captures" : [ ] } } { "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "email" : { "match" : "fred@MongoDB.com", "idx" : 28, "captures" : [ ] } } - Segunda etapa
El escenario utiliza el escenario
$setpara restablecer elemailal valor actual de"$email.match". Si el valor actual deemailes nulo, el nuevo valor deemailse establece en nulo.{ "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "email" : "aunt.arc.tica@example.com" } { "_id" : 2, "comment" : "I wanted to concatenate a string" } { "_id" : 3, "comment" : "I can't find how to convert a date to string. cam@mongodb.com", "email" : "cam@mongodb.com" } { "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "email" : "fred@MongoDB.com" }
Aplicar $regexFind a los elementos de cadena de un arreglo
Cree una colección de muestra contacts con los siguientes documentos:
db.contacts.insertMany([ { "_id" : 1, name: "Aunt Arc Tikka", details: [ "+672-19-9999", "aunt.arc.tica@example.com" ] }, { "_id" : 2, name: "Belle Gium", details: [ "+32-2-111-11-11", "belle.gium@example.com" ] }, { "_id" : 3, name: "Cam Bo Dia", details: [ "+855-012-000-0000", "cam.bo.dia@example.com" ] }, { "_id" : 4, name: "Fred", details: [ "+1-111-222-3333" ] } ])
La siguiente agregación utiliza $regexFind para convertir la matriz details en un documento incrustado con campos email y phone:
db.contacts.aggregate( [ { $unwind: "$details" }, { $addFields: { "regexemail": { $regexFind: { input: "$details", regex: /^[a-z0-9_.+-]+@[a-z0-9_.+-]+\.[a-z0-9_.+-]+$/, options: "i" } }, "regexphone": { $regexFind: { input: "$details", regex: /^[+]{0,1}[0-9]*\-?[0-9_\-]+$/ } } } }, { $project: { _id: 1, name: 1, details: { email: "$regexemail.match", phone: "$regexphone.match" } } }, { $group: { _id: "$_id", name: { $first: "$name" }, details: { $mergeObjects: "$details"} } }, { $sort: { _id: 1 } } ])
- Primera etapa
La etapa
$unwindsdel arreglo en documentos separados:{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "+672-19-9999" } { "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "aunt.arc.tica@example.com" } { "_id" : 2, "name" : "Belle Gium", "details" : "+32-2-111-11-11" } { "_id" : 2, "name" : "Belle Gium", "details" : "belle.gium@example.com" } { "_id" : 3, "name" : "Cam Bo Dia", "details" : "+855-012-000-0000" } { "_id" : 3, "name" : "Cam Bo Dia", "details" : "cam.bo.dia@example.com" } { "_id" : 4, "name" : "Fred", "details" : "+1-111-222-3333" } - Segunda etapa
La etapa utiliza la etapa
$addFieldspara agregar nuevos campos al documento que contiene el resultado de la$regexFindpara el número de teléfono y el correo electrónico:{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "+672-19-9999", "regexemail" : null, "regexphone" : { "match" : "+672-19-9999", "idx" : 0, "captures" : [ ] } } { "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "aunt.arc.tica@example.com", "regexemail" : { "match" : "aunt.arc.tica@example.com", "idx" : 0, "captures" : [ ] }, "regexphone" : null } { "_id" : 2, "name" : "Belle Gium", "details" : "+32-2-111-11-11", "regexemail" : null, "regexphone" : { "match" : "+32-2-111-11-11", "idx" : 0, "captures" : [ ] } } { "_id" : 2, "name" : "Belle Gium", "details" : "belle.gium@example.com", "regexemail" : { "match" : "belle.gium@example.com", "idx" : 0, "captures" : [ ] }, "regexphone" : null } { "_id" : 3, "name" : "Cam Bo Dia", "details" : "+855-012-000-0000", "regexemail" : null, "regexphone" : { "match" : "+855-012-000-0000", "idx" : 0, "captures" : [ ] } } { "_id" : 3, "name" : "Cam Bo Dia", "details" : "cam.bo.dia@example.com", "regexemail" : { "match" : "cam.bo.dia@example.com", "idx" : 0, "captures" : [ ] }, "regexphone" : null } { "_id" : 4, "name" : "Fred", "details" : "+1-111-222-3333", "regexemail" : null, "regexphone" : { "match" : "+1-111-222-3333", "idx" : 0, "captures" : [ ] } } - Tercera etapa
El proceso utiliza el
$projectproceso para generar documentos con el campo_id, el camponamey el campodetails. El campodetailsse establece en un documento con los camposemailyphone, cuyos valores se determinan a partir de los camposregexemailyregexphone, respectivamente.{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "phone" : "+672-19-9999" } } { "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "email" : "aunt.arc.tica@example.com" } } { "_id" : 2, "name" : "Belle Gium", "details" : { "phone" : "+32-2-111-11-11" } } { "_id" : 2, "name" : "Belle Gium", "details" : { "email" : "belle.gium@example.com" } } { "_id" : 3, "name" : "Cam Bo Dia", "details" : { "phone" : "+855-012-000-0000" } } { "_id" : 3, "name" : "Cam Bo Dia", "details" : { "email" : "cam.bo.dia@example.com" } } { "_id" : 4, "name" : "Fred", "details" : { "phone" : "+1-111-222-3333" } } - Cuarta etapa
La fase utiliza la fase
$grouppara agrupar los documentos de entrada según su valor de_id. La etapa utiliza la expresión$mergeObjectspara fusionar los documentosdetails.{ "_id" : 3, "name" : "Cam Bo Dia", "details" : { "phone" : "+855-012-000-0000", "email" : "cam.bo.dia@example.com" } } { "_id" : 4, "name" : "Fred", "details" : { "phone" : "+1-111-222-3333" } } { "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "phone" : "+672-19-9999", "email" : "aunt.arc.tica@example.com" } } { "_id" : 2, "name" : "Belle Gium", "details" : { "phone" : "+32-2-111-11-11", "email" : "belle.gium@example.com" } } - Quinta etapa
La etapa utiliza la etapa
$sortpara ordenar los documentos por el campo_id.{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "phone" : "+672-19-9999", "email" : "aunt.arc.tica@example.com" } } { "_id" : 2, "name" : "Belle Gium", "details" : { "phone" : "+32-2-111-11-11", "email" : "belle.gium@example.com" } } { "_id" : 3, "name" : "Cam Bo Dia", "details" : { "phone" : "+855-012-000-0000", "email" : "cam.bo.dia@example.com" } } { "_id" : 4, "name" : "Fred", "details" : { "phone" : "+1-111-222-3333" } }
Utiliza agrupaciones capturadas para analizar el nombre de usuario
Cree una colección de muestra employees con los siguientes documentos:
db.employees.insertMany([ { "_id" : 1, name: "Aunt Arc Tikka", "email" : "aunt.tica@example.com" }, { "_id" : 2, name: "Belle Gium", "email" : "belle.gium@example.com" }, { "_id" : 3, name: "Cam Bo Dia", "email" : "cam.dia@example.com" }, { "_id" : 4, name: "Fred" } ])
El correo electrónico del empleado tiene el formato <firstname>.<lastname>@example.com. Utilizando el campo captured que se devuelve en los resultados $regexFind, puede extraer los nombres de usuario de los empleados.
db.employees.aggregate( [ { $addFields: { "username": { $regexFind: { input: "$email", regex: /^([a-z0-9_.+-]+)@[a-z0-9_.+-]+\.[a-z0-9_.+-]+$/, options: "i" } }, } }, { $set: { username: { $arrayElemAt: [ "$username.captures", 0 ] } } } ] )
- Primera etapa
La etapa utiliza la etapa
$addFieldspara agregar un nuevo campousernameal documento. El nuevo campo contiene el resultado de realizar la operación$regexFinden el campoemail:{ "_id" : 1, "name" : "Aunt Arc Tikka", "email" : "aunt.tica@example.com", "username" : { "match" : "aunt.tica@example.com", "idx" : 0, "captures" : [ "aunt.tica" ] } } { "_id" : 2, "name" : "Belle Gium", "email" : "belle.gium@example.com", "username" : { "match" : "belle.gium@example.com", "idx" : 0, "captures" : [ "belle.gium" ] } } { "_id" : 3, "name" : "Cam Bo Dia", "email" : "cam.dia@example.com", "username" : { "match" : "cam.dia@example.com", "idx" : 0, "captures" : [ "cam.dia" ] } } { "_id" : 4, "name" : "Fred", "username" : null } - Segunda etapa
La etapa usa la etapa
$setpara restablecer elusernameal elemento cero del arreglo"$username.captures". Si el valor actual deusernamees nulo, el nuevo valor deusernamese establece en nulo.{ "_id" : 1, "name" : "Aunt Arc Tikka", "email" : "aunt.tica@example.com", "username" : "aunt.tica" } { "_id" : 2, "name" : "Belle Gium", "email" : "belle.gium@example.com", "username" : "belle.gium" } { "_id" : 3, "name" : "Cam Bo Dia", "email" : "cam.dia@example.com", "username" : "cam.dia" } { "_id" : 4, "name" : "Fred", "username" : null }
Tip
Para obtener más información sobre el comportamiento del array captures y ejemplos adicionales, consulte el apartado Comportamiento de salida de captures.