Use consultas geoespaciais em operações compatíveis com o MongoDB para consultar documentos que estão dentro de 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ível com o MongoDB ou crie e conecte um banco de dados.
Verifique se você tem pelo menos um índice 2dsphere ou crie um índice 2dsphere.
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 fazer uma consulta geoespacial usando o operador $near, que calcula a distância de um ponto geográfico em relação a outros pontos geográficos em documentos. Em seguida, eles são classificados da distância mais próxima à mais distante nos resultados da consulta. Também é possível substituir essa ordem de classificação definindo uma classificação secundária, que não seja $natural, na sua consulta. O operador $near precisa estar em um campo de documento no filtro de consulta e conter um campo $geometry GeoJSON.
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, você poderá 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 sua partição precisa ser uma string. O filtro de partição precisa ser
combinado à consulta de pesquisa por um operador $and.
Limitações
- Não é possível usar operadores
$neare$textna 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.$nearnão pode ser usado com os operadores$notou$norem uma consulta.- O
$nearnão é compatível com consultas de agregação.