Overview
El path El parámetro es utilizado por la búsqueda de MongoDB
Operadores para especificar el campo o los campos que se buscarán. Puede contener:
Una cuerda
Una matriz de cadenas
Una especificación de analizador múltiple
Una matriz que contiene una combinación de cadenas y especificaciones de múltiples analizadores
Nota
No todos los operadores pueden usar todos los tipos de rutas. Consulte la documentación de cada operador para obtener más información sobre los tipos de rutas compatibles.
Uso
To search only a single indexed field, use a quoted string in the path parameter. The following example searches a field named description.
"path": "description"
To search multiple indexed fields, use an array of quoted strings in the path parameter. Documents which match on any of the specified fields are included in the result set. The following example searches the description and type fields.
"path": [ "description", "type" ]
Nota
La multi opción de ruta solo está disponible para campos de tipo cadena.
Si la definición de su índice contiene un campo con varios analizadores, puede especificar cuál usar. El path parámetro puede tomar un objeto con los siguientes campos:
Campo | Descripción |
|---|---|
| El nombre del campo que se va a buscar. |
| El nombre del analizador alternativo especificado en un |
| El objeto que contiene el carácter comodín
La ruta comodín solo es aceptada por los siguientes operadores: También se acepta la trayectoria con comodines para resalte. |
En la siguiente definición de índice, los campos denominados names y notes utilizan el analizador estándar. Un campo denominado comments utiliza standard como su analizador por defecto y también especifica un multi denominado mySecondaryAnalyzer que utiliza el analizador lucene.whitespace.
{ "mappings": { "dynamic": false, "fields": { "names": { "type": "string", "analyzer": "lucene.standard" }, "notes": { "type": "string", "analyzer": "lucene.standard" }, "comments": { "type": "string", "analyzer": "lucene.standard", "multi": { "mySecondaryAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } } } } } }
The following path example searches the comments field using the multi named mySecondaryAnalyzer in the index definition.
"path": { "value": "comments", "multi": "mySecondaryAnalyzer" }
To search a combination of indexed fields and fields with multiple analyzers, use an array. The following example searches the names and notes fields with the default analyzer, and the comments field using the multi named mySecondaryAnalyzer in the index definition.
"path": [ "names", "notes", { "value": "comments", "multi": "mySecondaryAnalyzer" } ]
The following path example searches all the fields that contain the letter n followed by any characters, and the comments field using the multi named mySecondaryAnalyzer in the index definition.
"path": [{ "wildcard": "n*" }, { "value": "comments", "multi": "mySecondaryAnalyzer" }]
Ejemplos
Los siguientes ejemplos utilizan una colección llamada cars que tiene los siguientes documentos:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." } { "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Black four-door SUV, three rows of seats." }
Las asignaciones de campos estáticos le permiten especificar cómo se deben indexar y buscar los campos individuales dentro de una colección.
La definición del índice para la colección cars es la siguiente:
{ "mappings": { "dynamic": false, "fields": { "make": { "type": "string", "analyzer": "lucene.standard" }, "description": { "type": "string", "analyzer": "lucene.standard", "multi": { "simpleAnalyzer": { "analyzer": "lucene.simple", "type": "string" } } } } } }
La definición de índice anterior especifica que el make campo se indexa con el analizador estándar. El description campo utiliza el standard analizador de forma predeterminada, pero también puede usar el analizador simple especificando simpleAnalyzer con el multi parámetro.
Búsqueda en un solo campo
The following example searches for the string Ford in the make field:
db.cars.aggregate([ { $search: { "text": { "query": "Ford", "path": "make" } } } ])
El ejemplo anterior devuelve el documento con _id: 3.
Búsqueda de campos múltiples
El siguiente ejemplo utiliza una matriz de campos en el parámetro path para buscar la cadena blue en el campo make o description.
db.cars.aggregate([ { $search: { "text": { "query": "blue", "path": [ "make", "description" ] } } } ])
La consulta anterior devuelve el siguiente resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Búsqueda de analizador alternativo
Ejemplo de analizador simple
El siguiente ejemplo utiliza el multi llamado simpleAnalyzer en la definición del índice, que utiliza el analizador simple.
La consulta busca en el campo description la cadena driver.
db.cars.aggregate([ { $search: { "text": { "query": "driver", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
La consulta anterior devuelve el siguiente resultado:
{ "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." }
El analizador simple indexa driver's
side airbag [driver s side airbagcomo], por lo que coincide driver con.
Por el contrario, el analizador estándar predeterminado indexa driver's side airbag [driver's side airbagcomo], por lo que coincidiría con driver's o side pero no driver con.
Ejemplo de analizador de espacios en blanco
Supongamos que el objeto multi en la definición de índice para la colección cars es el siguiente:
"multi": { "simpleAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } }
El siguiente ejemplo utiliza el multi llamado simpleAnalyzer en la definición del índice, que utiliza el analizador de espacios en blanco.
db.cars.aggregate([ { $search: { "text": { "query": "Three", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
La consulta anterior devuelve el siguiente resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Para la consulta anterior sobre el Three término, MongoDB Search solo devuelve los documentos que coinciden con el término Three y no con, ya three que el analizador de espacios en blanco distingue entre mayúsculas y minúsculas. Por el contrario, el analizador estándar predeterminado no distingue entre mayúsculas y minúsculas y devuelve todos los documentos que coinciden con el término de la consulta en el orden en que aparecen en la colección.
Ahora, considere la siguiente consulta:
db.cars.aggregate([ { $search: { "compound": { "should": [ { "text": { "path": "description", "query": "Three" } }, { "text": { "query": "Three", "path": { "value" : "description", "multi" : "simpleAnalyzer" }, score: { boost: { value: 2 }} } } ] } } }, { $project: { "_id": 0, "type": 1, "description": 1, "score": { "$meta": "searchScore" } } } ])
La consulta anterior devuelve los siguientes resultados:
{ "type" : "sedan", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers seats.", "score" : 1.1092689037322998 } { "type" : "SUV", "description" : "Black four-door SUV, three rows of seats.", "score" : 0.17812025547027588 }
En la query anterior, MongoDB Search devuelve documentos que contienen tanto Three como three. Sin embargo, el puntaje del resultado con Three es mayor porque, mientras que el documento con three se coincidió utilizando el analizador estándar por defecto, el documento con Three se coincidió tanto por el simpleAnalyzer específico como por el analizador estándar.por defecto.
El siguiente ejemplo utiliza una colección llamada posts con los siguientes documentos:
{ "_id": 1, "username": "pinto", "post": { "date": "12-03-2018", "forum": "Tofu Recipes", "body": "Spicy Garlic Tofu cooks up crispy in 10 minutes or less. Serve with broccoli and rice for a delicious vegetarian meal." } } { "_id": 2, "username": "paloma", "post": { "date": "12-08-2018", "forum": "Tofu Recipes", "body": "Crispy Tofu in Shiitake Broth has flavors of citrus and umami. Great as an appetizer or entree." } }
Las asignaciones de campos dinámicos le permiten indexar todos los campos de una colección según sea necesario.
La definición del índice para la colección posts es la siguiente:
{ "mappings": { "dynamic": true } }
Búsqueda de campos anidados
La siguiente consulta del operador compuesto busca en el campo post.body la cadena broccoli, y también especifica que el campo no debe contener la cadena cauliflower.
db.posts.aggregate([ { $search: { "compound": { "must": { "text": { "query": "broccoli", "path": "post.body" } }, "mustNot": { "text": { "query": "cauliflower", "path": "post.body" } } } } } ])
La consulta anterior devuelve el documento con _id: 1, en el que el campo posts.body contiene la cadena broccoli.
Búsqueda de campos comodín
El siguiente ejemplo utiliza una colección llamada cars, que tiene los siguientes documentos:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Two-door convertible, driver's-side airbag.", "warehouse" : [ { "inventory" : 5, "color" : "black" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }
La definición del índice para la colección cars es la siguiente:
{ "mappings": { "dynamic": true } }
Las siguientes consultas buscan los campos especificados utilizando el carácter comodín * para la cadena red.
Ejemplo de búsqueda en todos los campos
La siguiente consulta busca la cadena en todos los red campos.
db.cars.aggregate([ { "$search": { "phrase": { "path": { "wildcard": "*" }, "query": "red" } } } ])
La query devuelve los siguientes resultados:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }
Ejemplo de búsqueda de campo anidado
La siguiente consulta busca los campos anidados dentro del warehouse campo para la red cadena.
db.cars.aggregate([ { "$search": { "text": { "path": { "wildcard": "warehouse.*" }, "query": "red" } } } ])
La query devuelve los siguientes resultados:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }