Definição
$geoNearProduz documentos na ordem do mais próximo para o mais distante de um ponto especificado.
Observação
O MongoDB remove as
limitnumopções$geoNeare do estágio, bem como o limite padrão de documentos.100 Para limitar os resultados de$geoNear, use o estágio$geoNearcom o estágio$limit.O estágio
$geoNeartem a seguinte forma de protótipo:{ $geoNear: { <geoNear options> } } O operador do
$geoNearaceita um documento que contém as seguintes opções do$geoNear. Especifique todas as distâncias nas mesmas unidades que as do sistema de coordenadas dos documentos processados:CampoTipoDescriçãodistanceFieldstring
O campo de saída que contém a distância calculada. Para especificar um campo em um documento incorporado, use a notação de ponto.
distanceMultipliernúmero
Opcional. O fator para multiplicar todas as distâncias retornadas pela consulta. Por exemplo, utilize o
distanceMultiplierpara converter radianos, como retornado por uma consulta esférica, para quilômetros multiplicando pelo raio da Terra.includeLocsstring
Opcional. Isto especifica o campo de saída que identifica o local utilizado para calcular a distância. Esta opção é útil quando um campo de localização contém múltiplos locais. Para especificar um campo dentro de um documento incorporado, use notação de ponto.
keyOpcional. Especifique o campo indexado geoespacial para utilizar ao calcular a distância.
Se a sua coleção tiver
2d2dspheremúltiplos índices e/ou múltiplos índices , você deve utilizar akeyopção para especificar o caminho do campo indexado para utilizar. Especificar qual índice geoespacial usar fornece um exemplo completo .Se houver mais de um índice
2dou mais de um índice2dspheree você não especificar umkey, MongoDB retornará um erro.Se você não especificar
keye tiver no máximo apenas um índice2de/ou apenas um índice2dsphere, o MongoDB procurará primeiro um índice2dpara usar. Se um índice2dnão existir, o MongoDB procurará um índice2dspherepara usar.maxDistancenúmero
Opcional. A distância máxima do ponto central na qual os documentos podem estar. O MongoDB limita os resultados aos documentos que se enquadram dentro da distância especificada a partir do ponto central.
Especifique a distância em metros se o ponto especificado for GeoJSON e em radianos se o ponto especificado for pares de coordenadas legadas.
minDistancenúmero
Opcional. A distância mínima do ponto central na qual os documentos podem estar. O MongoDB limita os resultados aos documentos que estão fora da distância especificada do ponto central.
Especifique a distância em metros para dados GeoJSON e em radianos para pares de coordenadas legadas.
Novo na versão 3.2.
nearPonto GeoJSON ou par de coordenadas legado
querydocumento
Opcional. Limita os resultados aos documentos que correspondem à consulta. A sintaxe de consulta é a sintaxe habitual de consulta de operação de leitura MongoDB.
Você não pode especificar um predicado
$nearnoquerycampo do$geoNearestágio .sphericalbooleano
Opcional. Determina como MongoDB calcula a distância entre dois pontos:
Quando
true, MongoDB utiliza semântica do$nearSpheree calcula distâncias utilizando geometria esférica.Quando
false, MongoDB utiliza semântica$near: geometria esférica para índices 2dsphere e geometria planar para índices 2d.
Padrão: false.
Comportamento
Cálculos de distância
$geoNear calcula a distância com base no ponto mais próximo do parâmetro do documento de entrada.
Por exemplo, se o documento de entrada for uma forma, identificará o ponto no limite da forma que é mais próximo do ponto especificado e produzirá a distância entre o ponto especificado e o ponto mais próximo da$geoNear forma.
Considerações
Se utilizar o $geoNear, considere que:
Você só pode utilizar
$geoNearcomo o primeiro estágio de um pipeline.Você deve incluir a opção
distanceField. A opçãodistanceFieldespecifica o campo que conterá a distância calculada.$geoNearrequer um índice geoespacial.Se você tiver mais de um índice geoespacial na coleção, use o parâmetro
keyspara especificar qual campo usar no cálculo. Se você tiver somente um índice geoespacial,$geoNearimplicitamente usará o campo indexado no cálculo.
Exemplos
Crie uma collection places com os seguintes documentos:
db.places.insertMany( [ { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks" }, { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks" }, { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums" } ] )
A seguinte operação cria um índice 2dsphere no campo location:
db.places.createIndex( { location: "2dsphere" } )
Distância máxima
Observação
A coleção places acima tem um índice 2dsphere. A agregação a seguir utiliza $geoNear para encontrar documentos com localização de no máximo 2 metros do centro [ -73.99279 , 40.719296 ] e category igual a Parks.
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", maxDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ])
A agregação retorna o seguinte:
{ "_id" : 8, "name" : "Sara D. Roosevelt Park", "category" : "Parks", "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] }, "dist" : { "calculated" : 0.9539931676365992, "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] } } }
O documento correspondente contém dois novos campos:
dist.calculatedcampo que contém a distância calculada edist.locationque contém o local utilizado no cálculo.
Distância mínima
Observação
O exemplo seguinte utiliza a opção minDistance para especificar a distância mínima do ponto central que os documentos podem ser. A seguinte aggregation encontra todos os documentos com um local a pelo menos 2 metros do centro [ -73.99279 , 40.719296 ] e category igual a Parks.
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", minDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ])
Especifique qual índice geoespacial usar
Considere uma coleção places que tenha um índice 2dsphere no campo location e um índice 2d no campo legacy.
Um documento na collection places se assemelha a:
{ "_id" : 3, "name" : "Polo Grounds", "location": { "type" : "Point", "coordinates" : [ -73.9375, 40.8303 ] }, "legacy" : [ -73.9375, 40.8303 ], "category" : "Stadiums" }
O exemplo a seguir usa a opção key para especificar que a agregação deve usar os valores do campo location para a operação $geoNear e não os valores do campo legacy. O pipeline também usa $limit para retornar no máximo 5 documentos.
Observação
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.98142 , 40.71782 ] }, key: "location", distanceField: "dist.calculated", query: { "category": "Parks" } } }, { $limit: 5 } ])
A agregação retorna o seguinte:
{ "_id" : 8, "name" : "Sara D. Roosevelt Park", "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] }, "category" : "Parks", "dist" : { "calculated" : 974.175764916902 } } { "_id" : 1, "name" : "Central Park", "location" : { "type" : "Point", "coordinates" : [ -73.97, 40.77 ] }, "legacy" : [ -73.97, 40.77 ], "category" : "Parks", "dist" : { "calculated" : 5887.92792958097 } }