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
Para usar $regex, use uma das seguintes sintaxes:
{ <field>: { $regex: /pattern/, $options: '<options>' } } { "<field>": { "$regex": "pattern", "$options": "<options>" } } { <field>: { $regex: /pattern/<options> } }
Observação
A fim de usar $regex com mongodump, você deve colocar a query entre aspas simples ('{ ... }') para garantir que não interaja com seu ambiente 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"}}'
No MongoDB, você também pode usar objetos de expressão regular (ou seja, /pattern/) para especificar expressões regulares:
{ <field>: /pattern/<options> }
Para restrições sobre o uso de sintaxe específica, consulte Sintaxe $regex vs. /pattern/.
As seguintes <options> estão disponíveis para uso com expressão regular.
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 (ou seja, Se o padrão não contiver â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 o caractere de ponto (ou seja, |
| Aceita Unicode. Essa sinalização é aceita, mas é redundante. O UTF é definido por padrão no operador |
Observação
O operador $regex não é compatível com 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 implícitas AND 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 opções s
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 suportadas por PCRE em uma expressão regular que não são suportadas no JavaScript, você deve usar o operador $regex e especificar a expressão regular 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 $not pode executar a operação lógica NOT em ambos:
Objetos de expressão regular (ou seja,
/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 consultas $regex variam e dependem se a consulta diferencia maiúsculas e minúsculas ou não.
Consultas que diferenciam maiúsculas ou minúsculas
Para consultas de expressões regulares que diferenciam maiúsculas de minúsculas, se existir um índice para o campo, o MongoDB compara a expressão regular com os valores no índice, o que pode ser mais rápido do que uma verificação de coleção.
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 que se enquadram nesse intervalo.
Uma expressão regular é uma "expressão de prefixo" se começar com um acento circunflexo (^) ou uma âncora esquerda (\A), seguido por uma string de símbolos simples. Por exemplo, o regex /^abc.*/ será otimizado fazendo a correspondência apenas com os 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 estas expressões utilizam um índice se um índice apropriado existir; entretanto, /^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 é análogo à 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 a seguir usa a opção i para fazer uma correspondência insensível a maiúsculas e minúsculas para documentos com o valor sku que começa 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á à string como um todo, como no seguinte 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 opção s para permitir o caractere de ponto (ou seja, .) para combinar todos os caracteres, incluindo a nova linha, bem como a opção i para realizar 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, o exemplo de resultado é:
[ { _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, certas 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 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 consulta 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 consulta anterior não retorna nenhum documento, que é o resultado esperado.
Dica
Caracteres de escape para padrões Regex
Ao especificar *UCP ou qualquer outra opção de expressão regular, certifique-se de usar os caracteres de escape corretos para seu shell ou driver.