Definición
$regexFindProporciona la capacidad de coincidencia de patrones de expresiones regulares (regex) en expresiones de agregación. Si se encuentra una coincidencia, devuelve un documento con información sobre la primera coincidencia. Si no se encuentra ninguna coincidencia, devuelve nulo.
MongoDB utiliza expresiones regulares compatibles con Perl (es decir, "PCRE") versión 8.41 con soporte UTF-8.
Sintaxis
El operador $regexFind tiene la siguiente sintaxis:
{ $regexFind: { input: <expression> , regex: <expression>, options: <expression> } }
Campos del operador
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
Si el operador no encuentra una coincidencia, el resultado del operador es null.
Si el operador encuentra una coincidencia, el resultado del operador es un documento que contiene:
la primera cadena coincidente en la entrada,
el punto de códigoíndice (no índice de bytes) de la cadena coincidente en la entrada, y
Una matriz de cadenas que 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 expresiones regulares.
{ "match" : <string>, "idx" : <num>, "captures" : <array of strings> }
Comportamiento
$regexFind y intercalación
La coincidencia de cadenas $regexFind para siempre distingue entre mayúsculas y minúsculas y signos diacríticos. $regexFind 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, $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 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.
captures Comportamiento de salida
Si su patrón de expresión regular contiene grupos de captura y este encuentra una coincidencia en la entrada, la captures matriz 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 de la captures matriz es igual al número de grupos de captura en el patrón y el orden de la matriz coincide con el orden en que aparecen los grupos de captura.
Cree una colección de muestra denominada 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 canalización aplica el patrón de expresión regular /(C(ar)*)ol/ al fname campo:
db.contacts.aggregate([ { $project: { returnObject: { $regexFind: { input: "$fname", regex: /(C(ar)*)ol/ } } } } ])
El patrón regex encuentra una coincidencia con fname valores Carol Colleeny:
{ "_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 (ar) anidado. Los elementos de la captures matriz corresponden a ambos grupos de captura. Si un documento coincidente no es capturado por un grupo (p. ej., Colleen y el (ar) grupo), reemplaza el grupo con un marcador de posición$regexFind nulo.
Como se muestra en el ejemplo anterior, la matriz captures contiene un elemento para cada grupo de captura (se usa null para los grupos sin captura). Considere el siguiente ejemplo, que busca números de teléfono con prefijos de la ciudad de Nueva York aplicando un or lógico de grupos de captura al campo phone. Cada grupo representa un prefijo 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 captures matriz incluye el grupo de captura coincidente y reemplaza cualquier grupo que no sea de captura null con:
{ "_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 como se analiza en este ejemplo, cree una colección de $regexFind 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. $regexFind Por ejemplo, la siguiente agregación realiza una que distingue entre mayúsculas y $regexFind minúsculas en el description campo. 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 expresión regular /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 idx campo es el índice del punto de código, no el índice del byte. Para ilustrarlo, considere el siguiente ejemplo que utiliza el patrón de expresión /tier/ regular:
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 usa 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 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 { $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 agregación sindistinción entre mayúsculas $regexFind y minúsculas en el description campo. 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 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 { $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 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: { 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 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 { $regexFind: { input: "$description", regex: /line/, options: "x" } } { $regexFind: { 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: { 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 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 { $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, 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: { 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 }
Utilice $regexFind para analizar el correo electrónico a partir de una cadena
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 $regexFind para extraer el correo electrónico del campo comment (sin distinguir 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 usa la etapa para agregar un nuevo
$addFieldscampoemailal documento. El nuevo campo contiene el resultado de ejecutar la operación en$regexFindelcommentcampo:{ "_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
La etapa usa la etapa para restablecer
$setalemail"$email.match"valor actual. 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 una matriz
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 para convertir $regexFind la details matriz en un documento incrustado con email phone campos y:
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 divide la matriz en documentos
$unwindsseparados:{ "_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 para agregar nuevos campos al
$addFields$regexFinddocumento que contiene el resultado de para 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
La etapa utiliza la etapa para generar documentos con
$projectlos_idcampos,namedetailsy. Eldetailscampo se establece en un documento conemaillosphonecampos y, cuyos valores se determinan a partir de losregexemailregexphonecampos y, 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 etapa utiliza la etapa para agrupar los documentos de entrada por
$groupsu_idvalor. La etapa utiliza la expresión para fusionar$mergeObjectslosdetailsdocumentos.{ "_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" } }
Usar 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 <firstname>.<lastname>@example.com formato. Usando el captured campo devuelto en los $regexFind resultados, puede analizar 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 usa la etapa para agregar un nuevo
$addFieldscampousernameal documento. El nuevo campo contiene el resultado de ejecutar la operación en$regexFindelemailcampo:{ "_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 utiliza la etapa para restablecer
$setalusernameelemento cero de la"$username.captures"matriz. 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 de la captures matriz y ejemplos adicionales, consulte captures Comportamiento de salida.