Docs Menu
Docs Home
/ /

regex (Operador de búsqueda de MongoDB)

regex

regex interpreta el campo query como una expresión regular. regex es un operador a nivel de término, lo que significa que el campo query no se analiza.

Tip

  • Analizadores.

  • Ejemplo de campo analizado.

Nota

El lenguaje de expresiones regulares disponible para el operador regex es un subconjunto limitado del BibliotecaPCRE.

Para obtener información detallada, consulte la clase RegExp documentación.

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}

regex utiliza los siguientes términos para construir una consulta:

Campo
Tipo
Descripción
Necesidad
predeterminado

query

cadena o matriz de cadenas

Cadena o cadenas a buscar.

path

cadena o matriz de cadenas

Campo o campos indexados para buscar. También puede especificar una ruta comodín para la búsqueda.

allowAnalyzedField

booleano

Debe establecerse en true si la consulta se ejecuta en un campo analizado.

no

false

score

Objeto

Puntuación para asignar a los resultados de búsqueda coincidentes. Las opciones son:

  • boost:multiplica la puntuación del resultado por el número dado.

  • constant:reemplace la puntuación del resultado con el número dado.

  • function:reemplace la puntuación del resultado con la expresión dada.

no

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.

El operador de búsqueda de MongoDB regex utiliza el motor de expresiones regulares Lucene, que difiere de las expresiones regulares compatibles con Perl.

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:

"*\\\*"
Operador
Descripción
Ejemplo

.

Coincide con cualquier carácter.

x.z matches "xyz", "xaz", etc.

?

El carácter anterior es opcional y coincide si no aparece más de una vez.

xyz? coincide con "xy" y "xyz"

+

El carácter anterior coincide si aparece una o más veces.

xy+ coincide con "xy", "xyy", "xyyy", etc.

*

El carácter anterior coincide si aparece cualquier número de veces.

xyz* coincide con "xy", "xyz", "xyzz", etc.

|

El operador OR. La expresión coincide si cualquiera de los dos patrones a ambos lados del operador | coincide.

abc|xyz coincide con "abc" o "xyz"

{<number>}

El carácter anterior coincide si aparece exactamente <number> <número> veces.

xyz{3} coincide con "xyzzz"

()

Los caracteres dentro de paréntesis se tratan como una sola unidad a efectos de coincidencia.

xyz(abc)[2] coincide con "xyzabcabc"

[]

Coincide con cualquiera de los caracteres dentro de los corchetes.

Agregar un ^ al comienzo coincide con cualquier carácter excepto aquellos dentro de los corchetes.

Dentro de los corchetes, - indica un rango, a menos que - sea el primer carácter o se escape con un \.

[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.

<1-3> coincide con "1", "2" y "3"

#

El operador de lenguaje vacío. El operador # no coincide con ninguna cadena, ni siquiera con una cadena vacía.

#|xyz coincide con "xyz" y nada más

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.

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.

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.

1db.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.

1db.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.

1db.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') }
]
}
}
}
]

Volver

rango

En esta página