Definición
regexregexinterpreta el campoquerycomo una expresión regular.regexes un operador a nivel de término, lo que significa que el campoqueryno se analiza.Nota
El lenguaje de expresiones regulares disponible para el operador
regexes un subconjunto limitado del BibliotecaPCRE.Para obtener información detallada, consulte la clase RegExp documentación.
Sintaxis
regex tiene la siguiente sintaxis:
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "regex": { 5 "query": "<search-string>", 6 "path": "<field-to-search>", 7 "allowAnalyzedField": <boolean>, 8 "score": <options> 9 } 10 } 11 }
opciones
regex utiliza los siguientes términos para construir una consulta:
Campo | Tipo | Descripción | Necesidad | predeterminado |
|---|---|---|---|---|
| cadena o matriz de cadenas | Cadena o cadenas a buscar. | sí | |
| cadena o matriz de cadenas | Campo o campos indexados para buscar. También puede especificar una ruta comodín para la búsqueda. | sí | |
| booleano | Debe establecerse en | no |
|
| Objeto | Puntuación para asignar a los resultados de búsqueda coincidentes. Las opciones son:
| no |
Comportamiento
regex query Es un standard operador a nivel de término, lo que significa que el campo no se analiza. Las búsquedas de expresiones regulares funcionan bien con el analizador de palabras clave, ya que indexa los campos palabra por palabra. Para realizar una búsqueda que distinga entre mayúsculas y minúsculas, no utilice el analizador predeterminado (el analizador estándar), ya que el analizador convierte todos los términos en minúsculas. En su lugar, especifique otro analizador.
Es posible utilizar el operador regex para realizar búsquedas en un campo analizado configurando la opción allowAnalyzedField en true, pero es posible que obtenga resultados inesperados.
Ejemplo
La búsqueda de .*Star Trek.* en un campo indexado con el analizador de palabras clave encuentra todos los documentos que contienen la cadena Star Trek en cualquier contexto. La búsqueda de .*Star
Trek.* en un campo indexado con el analizador estándar no encuentra nada, ya que hay un espacio entre Star Treky, y el índice no contiene espacios.
Comportamiento de expresiones regulares de Lucene
El operador de búsqueda de MongoDB regex utiliza el motor de expresiones regulares Lucene, que difiere de las expresiones regulares compatibles con Perl.
Caracteres reservados
Los siguientes caracteres están reservados como operadores cuando se utilizan en expresiones regulares:
. ? + * | { } [ ] ( ) < > " \ @ #
Para utilizar cualquiera de los caracteres anteriores literalmente en una expresión de coincidencia, antepóngale un carácter \.
Ejemplo
who\? coincide con "¿quién?"
Al utilizar el carácter de escape en o mongosh con un controlador, debe utilizar una barra invertida doble antes del carácter que se va a escapar.
Ejemplo
Para crear una expresión comodín que busque cualquier cadena que contenga un asterisco literal en una canalización de agregación, utilice la siguiente expresión:
"*\\**"
El primer y el último asterisco actúan como comodines que coinciden con cualquier carácter, y el \\* coincide con un asterisco literal.
Nota
Utilice la siguiente expresión para escapar una barra invertida literal:
"*\\\*"
Operadores compatibles
Operador | Descripción | Ejemplo |
|---|---|---|
| Coincide con cualquier carácter. |
|
| El carácter anterior es opcional y coincide si no aparece más de una vez. |
|
| El carácter anterior coincide si aparece una o más veces. |
|
| El carácter anterior coincide si aparece cualquier número de veces. |
|
| El operador |
|
| El carácter anterior coincide si aparece exactamente <number> <número> veces. |
|
| Los caracteres dentro de paréntesis se tratan como una sola unidad a efectos de coincidencia. |
|
| Coincide con cualquiera de los caracteres dentro de los corchetes. Agregar un Dentro de los corchetes, | [xyz] matches "x", "y", and "z"[^abc] matches any character except "a", "b", or "c"[a-d] matches "a", "b", "c", or "d"[0-9] matches any numeric character from 0 through 9 |
| Coincidir con un rango numérico. |
|
| El operador de lenguaje vacío. El operador |
|
Operadores no compatibles
regex No se admiten operadores de anclaje. Por ejemplo, estos operadores no son compatibles:
^, que coincide con el comienzo de una línea.$, que coincide con el final de una línea.
Para que coincida con un término, la expresión regular debe coincidir con toda la cadena.
Ejemplos
Los siguientes ejemplos utilizan la movies colección de la sample_mflix base de datos con una definición de índice personalizada que utiliza el analizador de palabras clave. Si tiene el conjunto de datos de ejemplo en su clúster, puede crear un índice de búsqueda de MongoDB en la movies colección y ejecutar las consultas de ejemplo en su clúster.
Definición del índice
La siguiente definición de índice indexa el title campo en la movies colección con el analizador de palabras clave:
1 { 2 "mappings": { 3 "fields": { 4 "title": { 5 "analyzer": "lucene.keyword", 6 "type": "string" 7 }, 8 "genres": { 9 "type": "token" 10 } 11 } 12 } 13 }
The following example searches all title fields for movie titles that end with the word Seattle. The (.*) regular expression matches any number of characters.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "(.*) Seattle" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
{ "title" : "Sleepless in Seattle" } { "title" : "Battle in Seattle" }
El siguiente ejemplo utiliza la expresión regular [0-9]{2} (.){4}s para buscar títulos de películas que comiencen con un número de 2dígitos seguido de un espacio y terminen con una palabra de 5letras que termina en s.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "[0-9]{2} (.){4}s" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
{ "title" : "20 Dates" } { "title" : "25 Watts" } { "title" : "21 Grams" } { "title" : "13 Lakes" } { "title" : "18 Meals" } { "title" : "17 Girls" } { "title" : "16 Acres" } { "title" : "26 Years" } { "title" : "99 Homes" } { "title" : "45 Years" }
El siguiente ejemplo utiliza la expresión regular .* para buscar títulos de películas que contengan el término summer en cualquier parte de title y devuelve la cantidad de películas que coinciden con los criterios en cada género.
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "regex": { 7 "path": "title", 8 "query": ".*summer.*" 9 } 10 }, 11 "facets": { 12 "genresFacet": { 13 "type": "string", 14 "path": "genres" 15 } 16 } 17 } 18 } 19 } 20 ])
[ { count: { lowerBound: Long('6') }, facet: { genresFacet: { buckets: [ { _id: 'Comedy', count: Long('5') }, { _id: 'Fantasy', count: Long('3') }, { _id: 'Romance', count: Long('3') }, { _id: 'Drama', count: Long('2') }, { _id: 'Horror', count: Long('1') }, { _id: 'Mystery', count: Long('1') } ] } } } ]