$regexMatch (agregação)
Nesta página
Definição
Sintaxe
O operador $regexMatch
tem a seguinte sintaxe:
{ $regexMatch: { input: <expression> , regex: <expression>, options: <expression> } }
Campo | Descrição | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
A string na qual você deseja aplicar o padrão regex. Pode ser uma string ou qualquer expressão válida que resolva para uma string. | |||||||||||
O padrão regex a aplicar. Pode ser qualquer expressão válida que produza uma string ou padrão regex
Como alternativa, você também pode especificar as opções de regex com o campo de opções. Para especificar as Não é permitido especificar opções no campo | |||||||||||
Opcional. Os Não é permitido especificar opções no campo
|
Devoluções
O operador retorna um booleano:
true
se existir uma correspondência.false
se não existir uma correspondência.
Comportamento
Biblioteca CRE
A partir da versão 6.1, o MongoDB usa a biblioteca PCRE2 (Perl Compatible Regular Expressions) para implementar a correspondência de padrões de expressões regulares. Para saber mais sobre PCRE2, consulte a documentação do PCRE.
$regexMatch
e agrupamento
$regexMatch
ignora o agrupamento especificado para a coleção, db.collection.aggregate()
e o índice, se utilizado.
Por exemplo, crie uma coleção de amostras com força de agrupamento 1
(ou seja, comparar somente o caráter base e ignorar outras diferenças, como caso e diacríticos):
db.createCollection( "myColl", { collation: { locale: "fr", strength: 1 } } )
Insira os seguintes documentos:
db.myColl.insertMany([ { _id: 1, category: "café" }, { _id: 2, category: "cafe" }, { _id: 3, category: "cafE" } ])
Usando o agrupamento da coleção, a operação a seguir executa uma correspondência sem distinção entre maiúsculas e minúsculas e sem distinção entre diacríticos:
db.myColl.aggregate( [ { $match: { category: "cafe" } } ] )
A operação retorna os seguintes 3 documentos:
{ "_id" : 1, "category" : "café" } { "_id" : 2, "category" : "cafe" } { "_id" : 3, "category" : "cafE" }
No entanto, a expressão de agregação $regexMatch
ignora o agrupamento; ou seja, os próximos exemplos de correspondência de padrão de expressão regular diferenciam maiúsculas de minúsculas e diacríticos:
db.myColl.aggregate( [ { $addFields: { results: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ] ) db.myColl.aggregate( [ { $addFields: { results: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ], { collation: { locale: "fr", strength: 1 } } // Ignored in the $regexMatch )
Ambas as operações retornam o seguinte:
{ "_id" : 1, "category" : "café", "results" : false } { "_id" : 2, "category" : "cafe", "results" : true } { "_id" : 3, "category" : "cafE", "results" : false }
Para executar uma correspondência de padrão regex sem distinção entre maiúsculas e minúsculas, use a opção i
. Consulte Opção i
para ver um exemplo.
Exemplos
$regexMatch
e suas opções
Para ilustrar o comportamento do operador $regexMatch
como discutido neste exemplo, crie uma coleção de amostra products
com os seguintes 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 padrão, $regexMatch
realiza uma correspondência com distinção entre maiúsculas e minúsculas. Por exemplo, a aggregation a seguir realiza uma que diferencia maiúsculas-minúsculas $regexMatch
no campo description
. O padrão regex /line/
não especifica nenhum agrupamento:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /line/ } } } } ])
A operação retorna o seguinte:
{ "_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 }
O seguinte padrão regex /lin(e|k)/
especifica um agrupamento (e|k)
no padrão:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /lin(e|k)/ } } } } ])
A operação retorna o seguinte:
{ "_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
Opção
Observação
Não é permitido especificar opções no campo regex
e options
.
Para executar a correspondência de padrãosem diferenciação de maiúsculas e minúsculas, inclua a opção i como parte do campo regex ou no campo options :
// 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 exemplo, a agregação a seguir executa um $regexMatch
que não diferencia maiúsculas de minúsculas no campo description
. O padrão regex /line/
não especifica nenhum agrupamento:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /line/i } } } } ])
A operação retorna os seguintes 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
Opção
Observação
Não é permitido especificar opções no campo regex
e options
.
Para corresponder às âncoras especificadas (por exemplo, ^
, $
) para cada linha de uma string de múltiplas linhas, inclua a opção m como parte do campo regex ou no campo opções:
// 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" } }
O exemplo a seguir inclui as opções i
e m
para combinar linhas começando com a letra s
ou S
para strings de várias linhas:
db.products.aggregate([ { $addFields: { result: { $regexMatch: { input: "$description", regex: /^s/im } } } } ])
A operação retorna o seguinte:
{ "_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
Opção
Observação
Não é permitido especificar opções no campo regex
e options
.
Para ignorar todos os caracteres de espaço em branco e comentários (indicados pelo caractere #
de hash sem formato e pelo próximo caractere de nova linha) no padrão, inclua a opção s no campo opções:
// Specify x in the options field { $regexMatch: { input: "$description", regex: /line/, options: "x" } } { $regexMatch: { input: "$description", regex: "line", options: "x" } }
O exemplo a seguir inclui a opção x
para ignorar espaços em branco e comentários sem escape:
db.products.aggregate([ { $addFields: { returns: { $regexMatch: { input: "$description", regex: /lin(e|k) # matches line or link/, options:"x" } } } } ])
A operação retorna o seguinte:
{ "_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
Opção
Observação
Não é permitido especificar opções no campo regex
e options
.
Para permitir o caractere ponto (ou seja, .
) no padrão para corresponder a todos os caracteres, incluindo o novo caractere de linha, inclua a opção s no campo opções:
// Specify s in the options field { $regexMatch: { input: "$description", regex: /m.*line/, options: "s" } } { $regexMatch: { input: "$description", regex: "m.*line", options: "s" } }
O exemplo a seguir inclui a opção s
para permitir que o caractere do ponto (ou seja, .) corresponda a todos os caracteres, incluindo uma nova linha, bem como a opção i
para realizar uma correspondência entre maiúsculas e minúsculas:
db.products.aggregate([ { $addFields: { returns: { $regexMatch: { input: "$description", regex:/m.*line/, options: "si" } } } } ])
A operação retorna o seguinte:
{ "_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 }
Usar $regexMatch
para verificar o endereço de e-mail
Criar uma collection de amostra feedback
com os seguintes 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" } ])
A agregação a seguir usa a $regexMatch
para verificar se o campo comment
contém um endereço de e-mail com @mongodb.com
e categorizar o feedback como Employee
ou External
.
db.feedback.aggregate( [ { $addFields: { "category": { $cond: { if: { $regexMatch: { input: "$comment", regex: /[a-z0-9_.+-]+@mongodb.com/i } }, then: "Employee", else: "External" } } } },
A operação retorna os seguintes 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" }