Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$regexMatch (agregação)

Nesta página

  • Definição
  • Sintaxe
  • Comportamento
  • Exemplos
$regexMatch

Executa uma correspondência de padrão de expressão regular (regex) e retorna:

  • true se existir uma correspondência.

  • false se não existir uma correspondência.

O MongoDB usa expressões regulares compatíveis com Perl (ou seja, "PCRE") versão 8.41 com suporte a UTF-8.

O operador $regexMatch tem a seguinte sintaxe:

{ $regexMatch: { input: <expression> , regex: <expression>, options: <expression> } }
Campo
Descrição
Entrada

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 /<pattern>/. Ao utilizar o regex /<pattern>/, você também pode especificar as opções regex i e m (mas não as opções s ou x):

  • "pattern"

  • /<pattern>/

  • /<pattern>/<options>

Como alternativa, você também pode especificar as opções de regex com o campo de opções . Para especificar as opções s ou x , você deve usar o campo de opções .

Não é permitido especificar opções no campo regex e options.

Opcional. Os <options> a seguir estão disponíveis para uso com expressões regulares.

Observação

Não é permitido especificar opções no campo regex e options.

Opção
Descrição
i
Insensibilidade a maiúsculas e minúsculas para combinar maiúsculas e minúsculas. Você pode especificar a opção no campo options ou como parte do campo regex.
m

Para padrões que incluem âncoras (ou seja, ^ para o início, $ para o final), corresponde ao início ou ao final de cada linha para strings com valores de várias linhas. Sem essa opção, essas âncoras coincidem no início ou no final da string.

Se o padrão não contiver âncoras ou se o valor da string não tiver caracteres de nova linha (por exemplo, \n), a opção m não tem efeito.

x

Capacidade "estendida" para ignorar todos os caracteres de espaço em branco no padrão, a menos que de escape ou incluído em uma classe de caracteres.

Além disso, ele ignora caracteres intermediários e inclui um caractere de cerquilha (#) não evitado e a próxima nova linha, para que você possa incluir comentários em padrões complicados. Isso se aplica apenas a caracteres de dados. Caracteres de espaço em branco nunca podem aparecer em sequências de caracteres especiais em um padrão.

A opção x não afeta o tratamento do caractere VT (ou seja, código 11).

Você pode especificar a opção somente no campo options.

s

Permite o caractere ponto (ou seja, .) para corresponder a todos os caracteres , incluindo caracteres de nova linha.

Você pode especificar a opção somente no campo options.

O operador retorna um booleano:

  • true se existir uma correspondência.

  • false se não existir uma correspondência.

Dica

Veja também:

$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 aggregation $regexMatch ignora o agrupamento; ou seja, os exemplos de correspondência de padrão de expressão regular a seguir 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çãoi . Consulte Opçãoi para ver um exemplo.

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, realiza uma correspondência com distinção entre maiúsculas e minúsculas. $regexMatch Por exemplo, a aggregation a seguir executa uma que diferencia maiúsculas minúsculas $regexMatch no description campo . 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 }

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 seguinte aggregation executa um que não diferenciamaiúsculas $regexMatch de minúsculas no description campo . 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 }

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 }

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 }

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 }

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 aggregation 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" }
← $regexFindAll (agregação)