Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / /

Construir um caminho de query

Nesta página

  • Visão geral
  • Uso
  • Exemplos
  • Pesquisa de campo único
  • Pesquisa de vários campos
  • Pesquisa alternativa de analisador
  • Pesquisa em campo aninhado
  • Pesquisa de campo curinga

O parâmetro path é usado pelos operadores do Atlas 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.

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
value
O nome do campo a ser pesquisado.
multi
O nome do analisador alternativo especificado em um objeto multi em uma definição de índice. Para saber mais, consulte Multianalisador.
wildcard

O objeto que contém o caractere curinga * para corresponder a qualquer caractere no nome do campo a ser pesquisado, inclusive campos aninhados. Um caminho curinga:

  • Deve ser definido como um objeto.

  • Não pode conter a opção value ou multi.

  • Não pode conter vários caracteres curinga consecutivos, como **.

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" }]

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.

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.

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."
}

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.

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 Atlas 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 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 Atlas 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
}
}

A seguinte query composta 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.

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.

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" }
]
}

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" }
]
}

Voltar

curinga