Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$regexFind (operador de expresión)

$regexFind

Brinda capacidad de coincidencia de patrones de expresión regular (regex) en las expresiones de agregación. Si se encuentra una coincidencia, se devuelve un documento que contiene información sobre la primera coincidencia. Si no se encuentra una coincidencia, se devuelve null.

El operador tiene la siguiente $regexFind sintaxis:

{ $regexFind: { input: <expression> , regex: <expression>, options: <expression> } }
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 /<pattern>/. Al usar la expresión regular /<pattern>/, también puedes especificar las opciones de expresión regular i y m (pero no las opciones s o x):

  • "pattern"

  • /<pattern>/

  • /<pattern>/<options>

Alternativamente, también puedes especificar las opciones de regex en el campo opciones. Para especificar las opciones s o x, debes utilizar el campo opciones.

No se pueden especificar opciones tanto en el campo regex como en el options.

Opcional. Los siguientes <options> están disponibles para su uso con expresiones regulares.

No se pueden especificar opciones tanto en el campo regex como en el options.

Opción
Descripción

i

Insensibilidad a mayúsculas y minúsculas para hacer coincidir tanto mayúsculas como minúsculas. Puedes especificar la opción en el campo options o como parte del campo regex.

m

Para patrones que incluyen anclajes (es decir, ^ para el inicio, $ para el final), haz coincidir al principio o al final de cada línea para strings con valores de varias líneas. Sin esta opción, estos anclajes coinciden al principio o al final del string.

Si el patrón no contiene anclas o si el valor de la string no tiene caracteres de nueva línea (p. ej., \n), la opción m no tiene efecto.

x

Capacidad “extendida” para ignorar todos los caracteres de espacio en blanco en el patrón, a menos que estén escapados o incluidos 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 el manejo del carácter VT (es decir, código 11).

Puedes especificar la opción solo en el campo options.

s

Permite el carácter punto (es decir, .) para que coincidan todos los caracteres incluidos los caracteres de salto de línea.

Puedes especificar la opción solo en el campo options.

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:

{ "match" : <string>, "idx" : <num>, "captures" : <array of strings> }

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.

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 i la opción para ver un ejemplo.

Si su patrón de expresión regular contiene grupos de captura y encuentra una coincidencia en la entrada, el captures array 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 captures array 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 fname campo:

db.contacts.aggregate([
{
$project: {
returnObject: {
$regexFind: { input: "$fname", regex: /(C(ar)*)ol/ }
}
}
}
])

El patrón de expresión regular encuentra una coincidencia con los fname valores Carol y Colleen de:

{ "_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 del captures array corresponden a los dos grupos de captura. Si un documento coincidente no es capturado por un grupo (porColleen ejemplo, y el (ar) grupo), reemplaza el grupo con un marcador de posición$regexFind 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 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" ] } }

Para ilustrar el comportamiento del operador como se explica 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" }
])

Por defecto, realiza una coincidencia sensible a mayúsculas y$regexFind minúsculas. Por ejemplo, la siguiente agregación realiza una sensible a 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/ } } } }
])

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 idx campo 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 /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 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" : [ ] } }

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
{ $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 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 }

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
{ $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 }

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
{ $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 }

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
{ $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 }

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 para extraer el correo electrónico $regexFind del comment campo (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 para agregar un nuevo $addFields campo email al documento. El nuevo campo contiene el resultado de realizar la operación en $regexFind el comment campo:

{ "_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 $set para restablecer el email al valor actual de "$email.match". Si el valor actual de email es nulo, el nuevo valor de email se 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" }

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 el 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 $unwinds del 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 para agregar nuevos campos al $addFields $regexFind documento que contiene el resultado de la 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

El proceso utiliza el $project proceso para generar documentos con el campo _id, el campo name y el campo details. El campo details se establece en un documento con los campos email y phone, cuyos valores se determinan a partir de los campos regexemail y regexphone, 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 $group para agrupar los documentos de entrada según su valor de _id. La etapa utiliza la expresión $mergeObjects para fusionar los documentos details.

{ "_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 $sort para 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" } }

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 que se devuelve 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 utiliza la etapa para agregar un nuevo $addFields campo username al documento. El nuevo campo contiene el resultado de realizar la operación en $regexFind el email campo:

{ "_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 $set para restablecer el username al elemento cero del arreglo "$username.captures". Si el valor actual de username es nulo, el nuevo valor de username se 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.