near Limitações do operador
Você não pode usar o operador near para consultar valores numéricos ou de data armazenados em uma array, mesmo que você tenha um índice do MongoDB Search. Você pode utilizar o intervalo somente para consultar valores numéricos indexados ou de data dentro de arrays.
Definição
nearO operador
nearsuporta consultar e classificar valores numéricos, de data e de ponto GeoJSON. Este operador pode ser usado para realizar uma pesquisa sobre:Campos numéricos dos tipos de dados BSON
int32,int64edouble.Os campos de data do BSON
datetipo no formatoISODate .Campos de localização geográfica definidos usando coordenadas de latitude e longitude.
Você pode usar o operador
nearpara encontrar resultados próximos a um número ou data. O operadornearpontua os resultados da MongoDB Search por proximidade do número ou da data.
Sintaxe
near tem a seguinte sintaxe:
{ $search: { "index": <index name>, // optional, defaults to "default" "near": { "path": "<field-to-search>", "origin": <date-or-number>, "pivot": <pivot-distance>, "score": <score-options> } } }
Opções
near usa os seguintes termos para construir uma consulta:
Campo | Tipo | Descrição | necessidade | |||
|---|---|---|---|---|---|---|
| data, número ou localidade | Número, data ou ponto geográfico para pesquisar próximo. Esta é a origem da qual a proximidade dos resultados é medida.
| sim | |||
| cadeia de caracteres ou matriz de cadeias de caracteres | Campos indexados a serem pesquisados. | sim | |||
| número | Valor a ser usado para calcular as pontuações dos documentos de resultados da MongoDB Search. A pontuação é calculada usando a seguinte fórmula: onde Os resultados têm uma pontuação igual a Se
| sim | |||
| objeto | Pontuação a ser atribuída aos resultados de pesquisa correspondentes. Você pode modificar a pontuação padrão usando as seguintes opções:
Para obter informações sobre como utilizar o Para saber mais, consulte Comportamento de pontuação. | no |
Comportamento de pontuação
A Pesquisa do MongoDB score é uma medida da proximidade dos resultados da Pesquisa do MongoDB para origin. O score é dimensionado entre 0 e 1 com 1 sendo uma correspondência exata e 0 sendo uma correspondência distante. A pontuação é igual a 0.5 quando a distância do resultado da Pesquisa MongoDB de origin é igual à distância longe da origem como calculado utilizando pivot.
The near operator uses the following distance decay function to calculate document score:
pivot score = ------------------ pivot + distance
where each term is defined as follows:
Fator | Descrição | |
|---|---|---|
| Valor especificado como ponto de referência para tornar a pontuação igual a | |
| Distância absoluta entre onde:
|
Você pode modificar a pontuação padrão utilizando a opção score em sua query. Para saber mais sobre as opções, Modifique a pontuação.
Exemplos
Os exemplos de número e data utilizam a coleção movies no banco de dados do sample_mflix . O exemplo Ponto GeoJSON utiliza a coleção listingsAndReviews no banco de dados sample_airbnb .
Se você carregar os dados de amostra em seu cluster, poderá criar os índices estáticos usando as definições de índice nos exemplos abaixo ou o índice dinâmico e executar as queries de exemplo no cluster.
Dica
Se já tiver carregado o conjunto de dados de amostra, consulte o tutorial Início Rápido do MongoDB Search para criar uma definição de índice e executar queries do MongoDB Search.
Exemplo de número
O exemplo seguinte utiliza o operador near para consultar um campo de número. As queries a seguir usam um índice chamado runtimes que indexa dinamicamente todos os campos na coleção movies. A query pesquisa documentos na coleção movies com um valor de campo runtime que está próximo de 279.
Exemplo básico
A seguinte query retorna todos os documentos que correspondem aos critérios de pesquisa. Inclui um estágio do $limit para limitar o resultado para 7 resultados e um estágio do $project para:
Excluir todos os campos, exceto
titleeruntimeAdicione um campo chamado
score
O score é calculado utilizando pivot.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "runtimes", 5 "near": { 6 "path": "year", 7 "origin": 2000, 8 "pivot": 2 9 } 10 } 11 }, 12 { 13 $limit: 7 14 }, 15 { 16 $project: { 17 "_id": 0, 18 "title": 1, 19 "runtime": 1, 20 score: { $meta: "searchScore" } 21 } 22 } 23 ])
[ { runtime: 279, title: 'The Kingdom', score: 1 }, { runtime: 279, title: 'The Kingdom', score: 1 }, { runtime: 279, title: 'The Jinx: The Life and Deaths of Robert Durst', score: 1 }, { runtime: 281, title: 'Les Misèrables', score: 0.5 }, { runtime: 277, title: 'Tokyo Trial', score: 0.5 }, { runtime: 283, title: 'Scenes from a Marriage', score: 0.3333333432674408 }, { runtime: 274, title: 'The Crimson Petal and the White', score: 0.2857142984867096 } ]
Nos resultados do MongoDB Search, os filmes The Kingdom e The
Jinx: The Life and Deaths of Robert Durst recebem uma pontuação de 1.0 porque seu valor de campo runtime de 279 é uma correspondência exata. Os filmes Les Misèrables e Tokyo Trial recebem uma pontuação de 0.5 porque seu valor de campo runtime está a 2 unidades de 279.
Exemplo de metadados
A query a seguir retorna os resultados de metadados para os critérios de pesquisa. Ou seja, ela usa o estágio $searchMeta para obter o número de filmes nos seguintes intervalos (anos) que correspondem aos critérios de pesquisa:
2000, limite inferior inclusivo para este bucket
2005, limite superior exclusivo para o bucket 2000 e limite inferior inclusivo para esse bucket
2010, limite superior exclusivo para o bucket 2005 e limite inferior inclusivo para esse bucket
2010, limite superior exclusivo para o bucket 2010
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "near": { 7 "path": "runtime", 8 "origin": 279, 9 "pivot": 2 10 } 11 }, 12 "facets": { 13 "yearFacet": { 14 "type": "number", 15 "path": "year", 16 "boundaries": [2000, 2005, 2010, 2015 ] 17 } 18 } 19 } 20 } 21 } 22 ])
[ { count: { lowerBound: Long('20910') }, facet: { yearFacet: { buckets: [ { _id: 2000, count: Long('3058') }, { _id: 2005, count: Long('4012') }, { _id: 2010, count: Long('4669') } ] } } } ]
Exemplo de data
O exemplo seguinte utiliza o operador near para consultar um campo de data.
Exemplo
A seguinte definição de índice chamada releaseddate indexa os valores de campo released na coleção movies :
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "released": { 6 "type": "date" 7 } 8 } 9 } 10 }
A query a seguir procura filmes lançados perto de 13 de setembro de 1. Inclui um estágio do $limit para limitar o resultado para 3 resultados e um estágio do $project para:
Excluir todos os campos, exceto
titleereleasedAdicione um campo chamado
score
O score dos resultados é calculado utilizando pivot.
Observação
pivot é medido aqui em milissegundos e 7,776,000,000 ms é igual a aproximadamente três meses.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "releaseddate", 5 "near": { 6 "path": "released", 7 "origin": ISODate("1915-09-13T00:00:00.000+00:00"), 8 "pivot": 7776000000 9 } 10 } 11 }, 12 { 13 $limit: 3 14 }, 15 { 16 $project: { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 score: { $meta: "searchScore" } 21 } 22 } 23 ])
A query acima retorna os seguintes resultados de pesquisa:
{ "title" : "Regeneration", "released" : ISODate("1915-09-13T00:00:00Z"), "score" : 1 } { "title" : "The Cheat", "released" : ISODate("1915-12-13T00:00:00Z"), "score" : 0.49723756313323975 } { "title" : "Hell's Hinges", "released" : ISODate("1916-03-05T00:00:00Z"), "score" : 0.34090909361839294 }
Nos resultados do MongoDB Search acima, o filme Regeneration recebe uma pontuação de 1 porque o valor do campo released de 1915-09-13 é uma correspondência exata. O filme The Cheat, que foi lançado em 1915-12-13, recebe uma pontuação de aproximadamente 0.5 porque a distância do valor do campo released em relação a origin é de aproximadamente 7,776,000,000 milissegundos em relação a 1915-09-13.
Exemplos de Pontos GeoJSON
Os exemplos seguintes utilizam o operador near para consultar um objeto de ponto GeoJSON na coleção sample_airbnb.listingsAndReviews . A seguinte definição de índice indexa os campos address.location e property_type na coleção listingsAndReviews.
Exemplo
1 { 2 "mappings": { 3 "fields": { 4 "address": { 5 "fields": { 6 "location": { 7 "type": "geo" 8 } 9 }, 10 "type": "document" 11 }, 12 "property_type": { 13 "type": "string" 14 } 15 } 16 } 17 }
Exemplo básico
Os exemplos seguintes utilizam o operador near para consultar o campo address.location na coleção do sample_airbnb.listingsAndReviews.
Exemplo
A consulta seguinte procura propriedades em Portugal. Inclui um estágio $limit para limitar o resultado para 3 resultados e um estágio $project para:
Excluir todos os campos, exceto
nameeaddressAdicione um campo chamado
score
O score dos resultados é calculado usando pivot. Observe que pivot é medido aqui em metros e 1.000 metros é igual a 1 quilômetro.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "near": { 5 "origin": { 6 "type": "Point", 7 "coordinates": [-8.61308, 41.1413] 8 }, 9 "pivot": 1000, 10 "path": "address.location" 11 } 12 } 13 }, 14 { 15 $limit: 3 16 }, 17 { 18 $project: { 19 "_id": 0, 20 "name": 1, 21 "address": 1, 22 score: { $meta: "searchScore" } 23 } 24 } 25 ])
A query acima retorna os seguintes resultados de pesquisa:
1 { 2 "name" : "Ribeira Charming Duplex", 3 "address" : { 4 "street" : "Porto, Porto, Portugal", 5 "suburb" : "", 6 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 7 "market" : "Porto", 8 "country" : "Portugal", 9 "country_code" : "PT", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ -8.61308, 41.1413 ], 13 "is_location_exact" : false 14 } 15 }, 16 "score" : 1 17 } 18 { 19 "name" : "DB RIBEIRA - Grey Apartment", 20 "address" : { 21 "street" : "Porto, Porto, Portugal", 22 "suburb" : "", 23 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 24 "market" : "Porto", 25 "country" : "Portugal", 26 "country_code" : "PT", 27 "location" : { 28 "type" : "Point", 29 "coordinates" : [ -8.61294, 41.14126 ], 30 "is_location_exact" : true 31 } 32 }, 33 "score" : 0.9876177310943604 34 } 35 { 36 "name" : "Ribeira 24 (4)", 37 "address" : { 38 "street" : "Porto, Porto, Portugal", 39 "suburb" : "", 40 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 41 "market" : "Porto", 42 "country" : "Portugal", 43 "country_code" : "PT", 44 "location" : { 45 "type" : "Point", 46 "coordinates" : [ -8.61318, 41.14107 ], 47 "is_location_exact" : false 48 } 49 }, 50 "score" : 0.973789632320404 51 }
Os resultados mostram que as propriedades que estão mais distantes das coordenadas especificadas têm uma pontuação mais baixa.
Exemplo composto
O exemplo a seguir usa o operador compound para consultar os campos property_type e address.location na coleção sample_airbnb.listingsAndReviews .
Exemplo
A seguinte consulta procura apartamentos em Hong Kong perto de um ponto GeoJSON especificado. A query usa must para especificar a condição do Atlas Search , que deve ser atendida, e should para especificar a preferência por localização. Ele inclui um estágio $limit para limitar a saída a 3 resultados e um estágio $project para:
Excluir todos os campos, exceto
property_typeeaddressAdicione um campo chamado
score
O score é calculado utilizando o campo pivot. Observe que pivot é medido aqui em metros e 1000 metros é igual a 1 quilômetro.
1 db.listingsAndReviews.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "must": { 6 "text": { 7 "query": "Apartment", 8 "path": "property_type" 9 } 10 }, 11 "should": { 12 "near": { 13 "origin": { 14 "type": "Point", 15 "coordinates": [114.15027, 22.28158] 16 }, 17 "pivot": 1000, 18 "path": "address.location" 19 } 20 } 21 } 22 } 23 }, 24 { 25 $limit: 3 26 }, 27 { 28 $project: { 29 "_id": 0, 30 "property_type": 1, 31 "address": 1, 32 score: { $meta: "searchScore" } 33 } 34 } 35 ])
A query acima retorna os seguintes resultados de pesquisa:
1 { 2 "property_type" : "Apartment", 3 "address" : { 4 "street" : "Hong Kong, Hong Kong Island, Hong Kong", 5 "suburb" : "Central & Western District", 6 "government_area" : "Central & Western", 7 "market" : "Hong Kong", 8 "country" : "Hong Kong", 9 "country_code" : "HK", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ 114.15027, 22.28158 ], 13 "is_location_exact" : true 14 } 15 }, 16 "score" : 1.177286982536316 17 } 18 { 19 "property_type" : "Apartment", 20 "address" : { 21 "street" : "Hong Kong, Hong Kong Island, Hong Kong", 22 "suburb" : "Central & Western District", 23 "government_area" : "Central & Western", 24 "market" : "Hong Kong", 25 "country" : "Hong Kong", 26 "country_code" : "HK", 27 "location" : { 28 "type" : "Point", 29 "coordinates" : [ 114.15082, 22.28161 ], 30 "is_location_exact" : true 31 } 32 }, 33 "score" : 1.1236450672149658 34 } 35 { 36 "property_type" : "Apartment", 37 "address" : { 38 "street" : "Hong Kong, 39 Hong Kong Island, Hong Kong", 40 "suburb" : "Mid-Levels", 41 "government_area" : "Central & Western", 42 "market" : "Hong Kong", 43 "country" : "Hong Kong", 44 "country_code" : "HK", 45 "location" : { 46 "type" : "Point", 47 "coordinates" : [ 114.15007, 22.28215 ], 48 "is_location_exact" : true 49 } 50 }, 51 "score" : 1.114811897277832 52 }