Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Menu Docs
Página inicial do Docs
/ /

$regex (operador de predicado da query)

Observação

Esta página descreve os recursos de pesquisa de expressões regulares para implantações autogerenciadas (não Atlas). Para dados hospedados no MongoDB Atlas, o MongoDB oferece uma solução de Full Text Search melhorada, Atlas Search, que tem seu próprio operador $regex. Para obter mais informações, consulte $regex na documentação do Atlas Search.

$regex

Fornece capacidades de expressão regular para strings de correspondência de padrões em consultas.

Você pode utilizar o $regex para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

Use uma das seguintes variações de sintaxe :

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ "<field>": { "$regex": "pattern", "$options": "<options>" } }
{ <field>: { $regex: /pattern/<options> } }

Observação

Para usar $regex com, coloque a documento entre aspas simples ('{... }') para garantir que ela não interaja com o mongodump shell.

A consulta deve estar no formato JSON v2 estendido (modo relaxado ou canônico/estrito), o que inclui posicionar os nomes de campo e operadores entre aspas. Por exemplo:

mongodump -d=sample_mflix -c=movies -q='{"year": {"$regex": "20"}}'

Você também pode utilizar objetos de expressão regular (/pattern/) para especificar expressões regulares:

{ <field>: /pattern/<options> }

Para restrições de uso de sintaxe , consulte Sintaxe $regex vs. /pattern/.

$options

Os seguintes <options> estão disponíveis para expressões regulares:

Opção
Descrição

i

Insensibilidade a maiúsculas e minúsculas para corresponder maiúsculas e minúsculas. Para obter um exemplo, consulte Executar correspondência de expressão regular insensível a maiúsculas e minúsculas.

m

Para padrões que incluem âncoras (^ para o início, $ para o final), corresponda no início ou no final de cada linha de strings com valores de várias linhas. Sem essa opção, essas âncoras coincidem no início ou no final da string. Para obter um exemplo, consulte Correspondência multilinha para linhas começando com padrão especificado.

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

x

Capacidade "estendida" para ignorar todos os caracteres de espaço em branco no padrão $regex, a menos que sejam evitados ou incluídos 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 manuseio do caractere TP (código 11).

s

Permite que o caractere de ponto. () corresponda a todos os caracteres,incluindo caracteres de nova linha. Para obter um exemplo, consulte Usar o . caractere de ponto para corresponder à nova linha .

u

Opção Unicode, que é aceita, mas redundante. UTF está habilitado por padrão para $regex.

Observação

$regex não suporta o modificador de pesquisa global g.

Para incluir uma expressão regular em um operador de predicado de consulta $in, você só pode usar objetos de expressão regular JavaScript (/pattern/ ).

Por exemplo:

{ name: { $in: [ /^acme/i, /^ack/ ] } }

Não é possível usar expressões de operador $regex dentro de um operador $in.

Para incluir uma expressão regular em uma lista separada por vírgula de condições de consulta para o campo, utilize o operador $regex. Por exemplo:

{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: 'acme.*corp', $options: 'i', $nin: [ 'acmeblahcorp' ] } }

Para usar a opção x ou s, você deve usar a expressão do operador $regex com o operador $options. Por exemplo, para especificar as opções i e s, você deve utilizar $options para ambos:

{ name: { $regex: /acme.*corp/, $options: "si" } }
{ name: { $regex: 'acme.*corp', $options: "si" } }

Para usar funcionalidades compatíveis comPCRE em uma expressão regular que não são suportadas no JavaScript, use o $regex operador e especifique o padrão como uma string.

Para corresponder strings insensíveis a maiúsculas e minúsculas:

  • "(?i)" inicia uma correspondência insensível a maiúsculas e minúsculas.

  • "(?-i)" encerra uma correspondência insensível a maiúsculas e minúsculas.

Por exemplo, a expressão regular "(?i)a(?-i)cme" corresponde a strings que:

  • Começam com "a" ou "A". Esta é uma correspondência insensível a maiúsculas e minúsculas.

  • Terminam com "cme". Esta é uma correspondência insensível a maiúsculas e minúsculas.

Estas strings correspondem ao exemplo de expressão regular:

  • "acme"

  • "Acme"

O exemplo a seguir usa o operador $regex para encontrar strings de campo name que correspondam à expressão regular "(?i)a(?-i)cme":

{ name: { $regex: "(?i)a(?-i)cme" } }

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ão regular. Para saber mais sobre PCRE2, consulte a documentação do PCRE.

O operador pode executar $not uma NOT operação lógica em ambos:

  • Objetos de expressão regular (/pattern/)

    Por exemplo:

    db.inventory.find( { item: { $not: /^p.*/ } } )
  • $regex expressões de operador

    Por exemplo:

    db.inventory.find( { item: { $not: { $regex: "^p.*" } } } )
    db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )

O uso e o desempenho do índice para $regex consultas dependem se a consulta é sensível a maiúsculas ou minúsculas.

Para consultas de expressão regular que diferenciam maiúsculas de minúsculas, se existir um índice para o campo, o MongoDB corresponderá à expressão regular para os valores no índice. Isso pode ser mais rápido do que uma verificação de collection.

Pode ocorrer otimização adicional se a expressão regular for uma " expressão de prefixo ", o que significa que todas as possíveis correspondências começam com a mesma string. Isso permite que o MongoDB construa um "intervalo" a partir desse prefixo e corresponda apenas aos valores do índice dentro do intervalo especificado.

Uma expressão regular é uma " expressão de prefixo " se começar com um sinal de intercalação (^) ou uma âncora à esquerda (\A), seguida por uma string de símbolos simples. Por exemplo, o regex /^abc.*/ é otimizado para corresponder somente aos valores do índice que começam com abc.

Além disso, embora /^a/, /^a.*/ e /^a.*$/ correspondam a strings equivalentes, eles têm características de desempenho diferentes. Todas essas expressões utilizam um índice se existir um índice apropriado. No entanto, /^a.*/ e /^a.*$/ são mais lentos. /^a/ pode parar a digitalização depois de combinar o prefixo.

Índices que não diferenciam maiúsculas de minúsculas não melhoram o desempenho para queries $regex, pois o operador $regex não é sensível à agrupamentos e, portanto, não pode tirar proveito de tais índices.

Os exemplos nesta seção usam a seguinte coleção products:

db.products.insertMany( [
{ _id: 100, sku: "abc123", description: "Single line description." },
{ _id: 101, sku: "abc789", description: "First line\nSecond line" },
{ _id: 102, sku: "xyz456", description: "Many spaces before line" },
{ _id: 103, sku: "xyz789", description: "Multiple\nline description" },
{ _id: 104, sku: "Abc789", description: "SKU starts with A" }
] )

O exemplo a seguir corresponde a todos os documentos onde o campo sku é como "%789":

db.products.find( { sku: { $regex: /789$/ } } )

O exemplo é semelhante à seguinte declaração SQL LIKE:

SELECT * FROM products
WHERE sku like "%789";

Saída de exemplo:

[
{ _id: 101, sku: 'abc789', description: 'First line\nSecond line' },
{ _id: 103, sku: 'xyz789', description: 'Multiple\nline description' },
{ _id: 104, sku: 'Abc789', description: 'SKU starts with A' }
]

O exemplo seguinte utiliza a opção i para executar uma correspondência insensível a maiúsculas e minúsculas para valores de sku que começam com ABC:

db.products.find( { sku: { $regex: /^ABC/i } } )

Saída de exemplo:

[
{ _id: 100, sku: 'abc123', description: 'Single line description.' },
{ _id: 101, sku: 'abc789', description: 'First line\nSecond line' },
{ _id: 104, sku: 'Abc789', description: 'SKU starts with A' }
]

O exemplo seguinte utiliza a opção m para corresponder linhas começando com a letra S para strings de múltiplas linhas:

db.products.find( { description: { $regex: /^S/, $options: 'm' } } )

Saída de exemplo:

[
{ _id: 100, sku: 'abc123', description: 'Single line description.' },
{ _id: 101, sku: 'abc789', description: 'First line\nSecond line' },
{ _id: 104, sku: 'Abc789', description: 'SKU starts with A' }
]

Sem a opção m, o exemplo de resultado é:

[
{ _id: 100, sku: 'abc123', description: 'Single line description.' },
{ _id: 104, sku: 'Abc789', description: 'SKU starts with A' }
]

Se o padrão $regex não contiver uma âncora, o padrão corresponderá a toda a string. Por exemplo:

db.products.find( { description: { $regex: /S/ } } )

Saída de exemplo:

[
{ _id: 100, sku: 'abc123', description: 'Single line description.' },
{ _id: 101, sku: 'abc789', description: 'First line\nSecond line' },
{ _id: 104, sku: 'Abc789', description: 'SKU starts with A' }
]

O exemplo a seguir usa a s opção para permitir que o caractere de ponto. () corresponda a todos os caracteres,incluindo a nova linha, e a i opção para executar uma correspondência insensível a maiúsculas e minúsculas:

db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )

Saída de exemplo:

[
{ _id: 102, sku: 'xyz456', description: 'Many spaces before line' },
{ _id: 103, sku: 'xyz789', description: 'Multiple\nline description' }
]

Sem a opção s, a query retorna:

[
{ _id: 102, sku: 'xyz456', description: 'Many spaces before line' }
]

O exemplo a seguir usa a opção x para ignorar os espaços em branco e os comentários, indicados por # e terminados em \n no padrão de correspondência:

var pattern = "abc #category code\n123 #item number"
db.products.find( { sku: { $regex: pattern, $options: "x" } } )

Saída de exemplo:

[
{ _id: 100, sku: 'abc123', description: 'Single line description.' }
]

O exemplo a seguir usa a expressão regular "(?i)a(?-i)bc" para corresponder às strings de campo sku que contêm:

  • "abc"

  • "Abc"

db.products.find( { sku: { $regex: "(?i)a(?-i)bc" } } )

Saída de exemplo:

[
{ _id: 100, sku: 'abc123', description: 'Single line description.' },
{ _id: 101, sku: 'abc789', description: 'First line\nSecond line' },
{ _id: 104, sku: 'Abc789', description: 'SKU starts with A' }
]

Novidades na versão 6.1.

Por padrão, algumas opções de regex (como /b e /w) reconhecem somente caracteres ASCII. Isso pode causar resultados inesperados ao realizar combinações regex com caracteres UTF-8.

A partir do MongoDB 6.1, você pode especificar a opção de regex *UCP para corresponder aos caracteres UTF-8.

Importante

Desempenho da opção UCP

A opção *UCP resulta em consultas mais lentas do que aquelas sem a opção especificada, pois *UCP exige uma pesquisa de tabela de múltiplos estágios para executar a correspondência.

Por exemplo, considere os seguintes documentos em uma coleção songs:

db.songs.insertMany( [
{ _id: 0, "artist" : "Blue Öyster Cult", "title": "The Reaper" },
{ _id: 1, "artist": "Blue Öyster Cult", "title": "Godzilla" },
{ _id: 2, "artist" : "Blue Oyster Cult", "title": "Take Me Away" }
] )

A seguinte consulta de regex utiliza a opção \b em uma correspondência regex. A opção \b corresponde a um limite de palavra.

db.songs.find( { artist: { $regex: /\byster/ } } )

Saída de exemplo:

[
{ _id: 0, artist: 'Blue Öyster Cult', title: 'The Reaper' },
{ _id: 1, artist: 'Blue Öyster Cult', title: 'Godzilla' }
]

Os resultados anteriores são inesperados porque nenhuma das palavras inteiras nos campos artist retornados começa com a string correspondente (yster). O caractere Ö em documentos _id: 0 e _id: 1 é ignorado ao executar a correspondência porque Ö é um caractere UTF-8.

O resultado esperado é que a query não retorne nenhum documento.

Para permitir que a consulta reconheça caracteres UTF-8, especifique a opção *UCP antes do padrão:

db.songs.find( { artist: { $regex: "(*UCP)/\byster/" } } )

A query anterior não retorna nenhum documento, que é o resultado esperado porque nenhuma das palavras inteiras nos campos artist começa com a string yster.

Dica

Caracteres de escape para padrões Regex

Ao especificar *UCP ou qualquer outra opção de expressão regular, use os caracteres de escape corretos para seu shell ou driver.

Voltar

$mod

Nesta página