Usar consultas geográficas
Use consultas geoespaciais em operações compatíveis com o MongoDB para consultar documentos que existem 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 um banco de dados e conecte-se a ele.
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 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 em documentos. Esses documentos 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 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 $near operador é usado para calcular a distância
entre o ponto geográfico (-122.084, 37.4221) e os pontos geográficos localizados no
location campo 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 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.$nearnão pode ser usado com os operadores$notou$norem uma consulta.$nearnão é compatível com consultas de agregação.