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.
Definição
Compatibilidade
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
Sintaxe
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/.
Os seguintes <options> estão disponíveis para expressões regulares:
Opção | Descrição |
|---|---|
| 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. |
| Para padrões que incluem âncoras ( Se o padrão não tiver âncoras ou se o valor da string não tiver caracteres de nova linha (por exemplo, |
| Capacidade "estendida" para ignorar todos os caracteres de espaço em branco no padrão Além disso, ele ignora caracteres intermediários e inclui um caractere de cerquilha ( A opção |
| Permite que o caractere de ponto |
| Opção Unicode, que é aceita, mas redundante. UTF está habilitado por padrão para |
Observação
$regex não suporta o modificador de pesquisa global g.
Comportamento
Sintaxe $regex vs. /pattern/
$in Expressões
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.
Condições AND implícitas para o campo
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' ] } }
x e s opções
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" } }
PCRE versus JavaScript
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.
$regex e a $not
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.*/ } } ) $regexexpressões de operadorPor exemplo:
db.inventory.find( { item: { $not: { $regex: "^p.*" } } } ) db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )
Uso do índice
O uso e o desempenho do índice para $regex consultas dependem se a consulta é sensível a maiúsculas ou minúsculas.
Consultas que diferenciam 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.
Consultas que não diferenciam maiúsculas ou minúsculas
Í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.
Exemplos
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" } ] )
Executar uma correspondência LIKE
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' } ]
Executar a correspondência de expressões regulares insensíveis a maiúsculas e minúsculas
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' } ]
Correspondência multilinha para linhas começando com padrão especificado
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' } ]
Use o . caractere de ponto para corresponder à nova linha
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' } ]
Ignorar espaços em branco no padrão
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.' } ]
Usar uma expressão regular para combinar maiúsculas e minúsculas em strings
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' } ]
Estender opções de regex para corresponder caracteres fora do ASCII
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.