Definição
regexregexinterpreta o campoquerycomo uma expressão regular.regexé um operador de nível de termo, o que significa que o campoquerynão é analisado.Observação
A linguagem de expressão regular disponível para o operador
regexé um subconjunto limitado da biblioteca PCRE.Para obter informações detalhadas, consulte a documentação do Class RegExp .
Sintaxe
regex tem a seguinte sintaxe:
{ $search: { "index": <index name>, // optional, defaults to "default" "regex": { "query": "<search-string>", "path": "<field-to-search>", "allowAnalyzedField": <boolean>, "score": <options> } }}Opções
regex usa os seguintes termos para construir uma consulta:
Campo | Tipo | Descrição | necessidade | Default |
|---|---|---|---|---|
| cadeia de caracteres ou matriz de cadeias de caracteres | String ou strings para pesquisar. | sim | |
| cadeia de caracteres ou matriz de cadeias de caracteres | Campos indexados a serem pesquisados. Você também pode especificar um caminho curinga para pesquisar. | sim | |
| booleano | Deve ser definido para | no |
|
| objeto | Pontuação a ser atribuída aos resultados correspondentes dos termos de pesquisa. As opções são:
| no |
Comportamento
regex é um operador de nível de termo, o que significa que o campo query não é analisado. As pesquisas com expressões regulares funcionam bem com o analisador de palavras-chave, pois ele indexa os campos uma palavra de cada vez. Para fazer uma pesquisa com distinção entre maiúsculas e minúsculas, não use o analisador padrão, o analisador standard, porque o analisador standard reduz todas as letras minúsculas dos termos. Em vez disso, especifique um analisador diferente.
É possível utilizar o operador regex para executar pesquisas em um campo analisado definindo a opção allowAnalyzedField para true, mas você pode obter resultados inesperados.
Exemplo
Pesquisar por .*Star Trek.* em um campo indexado com o analisador de palavras-chave encontra todos os documentos nos quais o campo contém a string Star Trek em qualquer contexto. A pesquisa de .*Star Trek.* em um campo indexado com o analisador padrão não encontra nada, pois há um espaço entre Star e Trek, e o índice não contém espaços.
Comportamento da Expressão Regular Lucene
O operador MongoDB Search regex utiliza o mecanismo de expressão regular Lucene, que difere de Expressões regulares compatíveis com Perl.
Caracteres reservados
Os seguintes caracteres são reservados como operadores quando usados em expressões comuns:
. ? + * | { } [ ] ( ) < > " \ @ #
Para usar qualquer um dos caracteres acima literalmente em uma expressão correspondente, inicie com um caractere \.
Exemplo
who\? corresponde a "quem?"
Ao usar o caractere de escape em mongosh ou com um driver, é necessário usar uma barra invertida dupla antes do caractere a ser escapado.
Exemplo
Para criar uma expressão curinga que procure qualquer string que contenha um asterisco literal em um aggregation pipeline, use a seguinte expressão:
"*\\**"O primeiro e o último asteriscos funcionam como curingas que correspondem a qualquer caractere, e o \\* corresponde a um asterisco literal.
Observação
Use a seguinte expressão para escapar de uma barra invertida literal:
"*\\\*"Operadores suportados
Operador | Descrição | Exemplo |
|---|---|---|
| Corresponde a qualquer caractere. |
|
| O caractere anterior é opcional e corresponde se não ocorrer mais de uma vez. |
|
| O caractere anterior corresponde se ocorrer uma ou mais vezes. |
|
| O caractere anterior corresponde se ocorrer qualquer número de vezes. |
|
| O operador |
|
| O caractere anterior corresponde se ocorrer exatamente <number> vezes. |
|
| Caracteres dentro dos parênteses são tratados como uma unidade única para fins de correspondência. |
|
| Corresponde a qualquer caractere dentro dos colchetes. Adicionar um Dentro dos colchetes, |
|
| Corresponder uma faixa numérica. |
|
| O operador de idioma vazio. O operador |
|
Operadores não suportados
regex não suporta operadores de âncora. Por exemplo, estes operadores não são suportados:
^, que coincide com o início de uma linha.$, que corresponde ao final de uma linha.
Para corresponder a um termo, a expressão regular deve corresponder à string completa.
Exemplos
Os exemplos a seguir usam a coleção movies no banco de dados sample_mflix com uma definição de índice personalizada que usa o analisador de palavras-chave. Se você tiver o dataset de amostra em seu cluster, poderá criar um índice de pesquisa do MongoDB na coleção movies e executar as consultas de exemplo em seu cluster.
Definição de Índice
A seguinte definição de índice indexa o campo title na coleção movies com o analisador de palavra-chave:
{ "mappings": { "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "type": "token" } } }}Posição a termo
O exemplo a seguir utiliza a expressão regular .* para localizar títulos de filmes que contenham o termo summer em qualquer parte do title e retorna a quantidade de filmes que atendem aos critérios em cada gênero.
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "regex": { "path": "title", "query": ".*summer.*" } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } } } }])O exemplo a seguir pesquisa todos os campos title para títulos de filmes que terminam com a palavra Seattle. A expressão comum (.*) corresponde a qualquer número de caracteres.
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": "(.*) Seattle" } } }, { $project: { "_id": 0, "title": 1 } }])Faixa de números
O exemplo a seguir usa a expressão regular [0-9]{2} (.){4}s para encontrar títulos de filmes que começam com um número de 2 dígitos seguido por um espaço e terminam com uma palavra de 5 letras terminando em s.
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": "[0-9]{2} (.){4}s" } } }, { $project: { "_id": 0, "title": 1 } }])Frase com várias palavras
O exemplo a seguir usa a expressão regular .*Toy Story.* para localizar todos os títulos de filmes que contêm a frase Toy Story. Como o campo de pesquisa usa o analisador de palavras-chave , o regex corresponde à frase exatamente como armazenada, incluindo o espaço entre as palavras.
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": ".*Toy Story.*" } } }, { $project: { "_id": 0, "title": 1 } }])Array de strings
O exemplo a seguir usa uma array de expressões regulares para encontrar títulos de filmes que correspondam a qualquer um dos padrões especificados. A query encontra títulos que terminam com Seattle ou contêm Toy Story.
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": ["(.*) Seattle", ".*Toy Story.*"] } } }, { $project: { "_id": 0, "title": 1 } }])Pesquisa sensível a maiúsculas e minúsculas
O exemplo a seguir demonstra a correspondência com distinção entre maiúsculas e minúsculas. Como o índice usa o analisador lucene.keyword , que preserva a capitalização original de cada valor indexado, a query deve corresponder às maiúsculas e minúsculas exatas dos títulos armazenados. A query .*Sleepless.* corresponde a Sleepless in Seattle, mas .*sleepless.* não retorna resultados.
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": ".*sleepless.*" } } }, { $project: { "_id": 0, "title": 1 } }])