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 PCRE librería.Para obtener información detallada, consulta 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 query:
Campo | Tipo | Descripción | Necesidad | predeterminado |
|---|---|---|---|---|
| string o arreglo de strings | String o strings de búsqueda. | Sí | |
| string o arreglo de strings | Campo o campos indexados para buscar. También puedes especificar una ruta comodín para buscar. | Sí | |
| booleano | Debe establecerse en | no |
|
| Objeto | Puntuación para asignar a los resultados coincidentes de términos de búsqueda. 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 se pueden obtener resultados inesperados.
Ejemplo
Buscar .*Star Trek.* en un campo indexado con el analizador de palabras clave encuentra todos los documentos en los que el campo contiene la string Star Trek en cualquier contexto. Buscar .*Star
Trek.* en un campo indexado con el analizador estándar no arroja resultados porque hay un espacio entre Star y Trek, y el índice no contiene espacios.
Comportamiento de Expresiones Regulares de Lucene
El operador MongoDB Search regex utiliza el motor de expresiones regulares de Lucene, que difiere de las expresiones regulares compatibles con Perl.
Caracteres reservados
Los siguientes caracteres están reservados como operadores cuando se usan 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 string que contenga un asterisco literal en una canalización de agregación, utilice la siguiente expresión:
"*\\**"
El primer y último asteriscos actúan como comodines que coinciden con cualquier carácter, y el \\* coincide con un asterisco literal.
Nota
Utiliza 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 ocurre no 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 entre paréntesis se tratan como una sola unidad para fines de coincidencia. |
|
| Coincide con cualquiera de los caracteres dentro de los corchetes. Agregar un Dentro de los corchetes cuadrados, | [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:
^y que corresponde al inicio 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 colección movies en la base de datos sample_mflix con una definición de índice personalizada que emplea el analizador de palabras clave. Si tienes el conjunto de datos de muestra en tu clúster, puedes crear un índice de búsqueda de MongoDB Search en la colección movies y ejecutar las consultas de ejemplo en tu clúster.
Definición del índice
La siguiente definición de índice indexa el campo title en la colección movies 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 encontrar títulos de películas que empiezan con un número de dos dígitos seguido de un espacio y terminan con una palabra de cinco letras 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 encontrar títulos de películas que contengan el término summer en cualquier lugar del title y retorna el número de películas que cumplen con el criterio 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') } ] } } } ]