Use consultas geoespaciais em operações compatíveis com o MongoDB para consultar documentos que existem em um determinado intervalo de uma longitude e latitude específicas.
Antes de começar
Verifique se você tem acesso a um banco de dados de operações compatíveis com o MongoDB ou crie um banco de dados e se conecte a ele.
Verifique se você tem pelo menos um índice 2dsphere ou crie um.
Objetos GeoJSON
Para executar uma consulta geoespacial em campos da sua coleção, os campos consultados precisam ser objetos GeoJSON ou GeoPoints.
Executar uma consulta geoespacial
É possível realizar uma consulta geoespacial usando o operador $near, que calcula
a distância de um ponto geográfico em relação a pontos geográficos dentro de
documentos. Esses documentos são classificados da distância mais próxima para a mais distante nos
resultados da consulta. Também é possível modificar essa ordem de classificação definindo uma classificação secundária, diferente de $natural, na consulta. O operador $near precisa existir em um campo de documento
no filtro de consulta e conter um campo GeoJSON $geometry.
No exemplo a seguir, o operador $near é usado para calcular a distância
entre o ponto geográfico (-122.084, 37.4221) e os pontos geográficos localizados no campo
location de todos os documentos em myCollection.. Os documentos são retornados
e ordenados pela distância mais próxima à mais distante entre os dois pontos.
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
}
}
}
}
)
Também é possível usar os campos opcionais $maxDistance e $minDistance para controlar a distância em metros do ponto da consulta.
O exemplo a seguir mostra uma consulta em que os documentos retornados precisam estar a pelo menos
500 metros e no máximo 2.000 metros do ponto (-122.084, 37.4221):
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
$maxDistance: 2000,
$minDistance: 500
}
}
}
Se o índice for particionado, será possível filtrar com base na partição
incluindo-a em um filtro de igualdade "and" na consulta.
Por exemplo, se você tiver uma partição region e quiser filtrar os resultados da consulta pela região midwest, faça o seguinte:
db.myCollection.find( { $and: [
{ location:
{ $near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
}
},
{ "region": "midwest" }
] } )
O valor da partição precisa ser uma string. O filtro de partição precisa ser
unido à consulta de pesquisa por um operador $and.
Limitações
- Os operadores
$neare$textnão podem ser usados na mesma consulta. $nearnão pode ser aninhado em uma instrução$orde várias cláusulas, a menos que$nearseja a única expressão na cláusula$or.- Não é possível usar
$nearcom os operadores$notou$norem uma consulta. $nearnão é compatível com consultas de agregação.