Visão geral
O parâmetro path é usado pelosoperadores do MongoDB Search para especificar o campo ou campos a serem pesquisados. Pode conter:
Um string
Um array de strings
Uma especificação de multianalisador
Uma array contendo uma combinação de strings e especificações de vários analisadores
Observação
Nem todos os operadores podem usar todos os diferentes tipos de caminhos. Consulte a documentação de cada operador individual para obter detalhes sobre os tipos de caminho suportados.
Uso
Para pesquisar somente um único campo indexado, use uma string entre aspas no parâmetro path. O exemplo a seguir pesquisa um campo denominado description.
"path": "description"
Para pesquisar múltiplos campos indexados, utilize uma array de strings citadas no parâmetro path. Os documentos que correspondem a qualquer um dos campos especificados são incluídos no conjunto de resultados. O exemplo seguinte pesquisa os campos description e type.
"path": [ "description", "type" ]
Observação
A opção de caminho do multi está disponível somente para campos do tipo string.
Se sua definição de índice contiver um campo com vários analisadores, você poderá especificar qual deles usar. O parâmetro path pode pegar um objeto com os seguintes campos:
Campo | Descrição |
|---|---|
| O nome do campo a ser pesquisado. |
| O nome do analisador alternativo especificado em um objeto |
| O objeto que contém o caractere curinga
O caminho curinga só é aceito pelos seguintes operadores: O caminho curinga também é aceito para destacar. |
Na definição de índice a seguir, os campos chamados names e notes usam o padrão . Um campo denominado comments utiliza standard como seu analisador padrão e também especifica um multi denominado mySecondaryAnalyzer que utiliza o analisador 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" } } } } } }
O seguinte exemplo do path pesquisa o campo comments utilizando o multi denominado mySecondaryAnalyzer na definição do índice.
"path": { "value": "comments", "multi": "mySecondaryAnalyzer" }
Para procurar uma combinação de campos indexados e campos com vários analyzer, use uma array. O exemplo a seguir procurar os campos names e notes com o analisador padrão e o campo comments usando o multi denominado mySecondaryAnalyzer na definição do índice.
"path": [ "names", "notes", { "value": "comments", "multi": "mySecondaryAnalyzer" } ]
O exemplo path a seguir procurar todos os campos que contêm a letra n seguida por qualquer caractere e o campo comments usando o multi chamado mySecondaryAnalyzer na definição do índice.
"path": [{ "wildcard": "n*" }, { "value": "comments", "multi": "mySecondaryAnalyzer" }]
Exemplos
Os seguintes exemplos utilizam uma coleção denominada cars que tem os seguintes 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." }
Mapeamentos de campo estáticos permitem especificar como campos individuais dentro de uma coleção devem ser indexados e pesquisados.
A definição do índice para a coleção cars é a seguinte:
{ "mappings": { "dynamic": false, "fields": { "make": { "type": "string", "analyzer": "lucene.standard" }, "description": { "type": "string", "analyzer": "lucene.standard", "multi": { "simpleAnalyzer": { "analyzer": "lucene.simple", "type": "string" } } } } } }
A definição de índice anterior especifica que o campo make é indexado com o analisador padrão. O campo description utiliza o analisador standard por padrão, mas também pode utilizar o analisador simples especificando simpleAnalyzer com o parâmetro multi.
Pesquisa de campo único
O exemplo a seguir procura o Ford de string no campo make :
db.cars.aggregate([ { $search: { "text": { "query": "Ford", "path": "make" } } } ])
O exemplo anterior retorna o documento com _id: 3.
Pesquisa de vários campos
O exemplo a seguir usa um array de campos no parâmetro path para pesquisar a string blue no campo make ou description.
db.cars.aggregate([ { $search: { "text": { "query": "blue", "path": [ "make", "description" ] } } } ])
A query anterior retorna o seguinte resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Pesquisa alternativa de analisador
Exemplo de analisador simples
O exemplo seguinte utiliza o multi denominado simpleAnalyzer na definição de índice, que utiliza o analisador simples.
A query pesquisa o campo description para a string driver.
db.cars.aggregate([ { $search: { "text": { "query": "driver", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
A query anterior retorna o seguinte resultado:
{ "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." }
O analisador simples indexa driver's
side airbag como [driver s side airbag], então ele corresponde em driver.
Por outro lado, os índices padrão do analisador driver's side airbag como [driver's side airbag], então ele corresponderia em driver's ou side mas não driver.
Exemplo de analisador de espaços em branco
Suponha que o objeto multi na definição de índice para a coleção cars seja o seguinte:
"multi": { "simpleAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } }
O exemplo a seguir usa multi denominado simpleAnalyzer na definição do índice, que usa o analyzer de espaço em branco.
db.cars.aggregate([ { $search: { "text": { "query": "Three", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
A query anterior retorna o seguinte resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Para a query acima sobre o termo Three, o MongoDB Search retorna apenas documentos que correspondem ao termo Three e não three, pois o analisador de espaço em branco diferencia maiúsculas de minúsculas. Por outro lado, o analisador padrão não diferencia maiúsculas de minúsculas e retorna todos os documentos que correspondem ao termo na query na ordem em que estão listados na coleção.
Agora, considere a seguinte query:
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" } } } ])
A query anterior retorna os seguintes 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 }
Para a query acima, o MongoDB Search retorna documentos tanto com Three quanto com three. No entanto, a pontuação do resultado com Three é maior porque, enquanto o documento com three foi combinado usando o analisador padrão, o documento com Three foi combinado tanto pelo analisador específico simpleAnalyzer quanto pelo analisador padrão.
O exemplo seguinte utiliza uma coleção denominada posts com os seguintes 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." } }
Os mapeamentos de campo dinâmicos permitem indexar todos os campos em uma coleção conforme necessário.
A definição do índice para a coleção posts é a seguinte:
{ "mappings": { "dynamic": true } }
Pesquisa em campo aninhado
A seguinte query de operador composto pesquisa o campo post.body para a string broccoli e também especifica que o campo não deve conter a string cauliflower.
db.posts.aggregate([ { $search: { "compound": { "must": { "text": { "query": "broccoli", "path": "post.body" } }, "mustNot": { "text": { "query": "cauliflower", "path": "post.body" } } } } } ])
A query anterior retorna o documento com _id: 1, no qual o campo posts.body contém a string broccoli.
Pesquisa de campo curinga
O exemplo seguinte utiliza uma coleção denominada cars, que tem os seguintes 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" } ] }
A definição do índice para a coleção cars é a seguinte:
{ "mappings": { "dynamic": true } }
As seguintes queries pesquisam os campos especificados utilizando o caractere curinga * para a string red.
Exemplo de pesquisa de todos os campos
A seguinte query pesquisa todos os campos para a string red.
db.cars.aggregate([ { "$search": { "phrase": { "path": { "wildcard": "*" }, "query": "red" } } } ])
A query retorna os seguintes 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" } ] }
Exemplo de pesquisa de campo aninhado
A seguinte query pesquisa os campos aninhados dentro do campo warehouse para a string red.
db.cars.aggregate([ { "$search": { "text": { "path": { "wildcard": "warehouse.*" }, "query": "red" } } } ])
A query retorna os seguintes 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" } ] }