Geospatial no MongoDB | Mongoshell (mongosh) | MongoDB | Banco de dados
- Geospatial no MongoDB | Mongoshell (mongosh) | MongoDB | Banco de dados
Visão geral
O MongoDB possui suporte nativo para consultas geoespaciais, permitindo trabalhar com dados baseados em localização.
Principais capacidades:
- busca por proximidade
- filtragem por área
- interseção de regiões
- cálculos de distância
Essas operações são baseadas em:
- GeoJSON
- índices geoespaciais (
2dsphere)
Estrutura de dados (GeoJSON)
Formato padrão utilizado:
{
location: {
type: "Point",
coordinates: [-46.6333, -23.5505] // [longitude, latitude]
}
}
Tipos suportados:
PointLineStringPolygonMultiPointMultiPolygon
Regras importantes:
- ordem correta:
[longitude, latitude] - compatível com padrão GeoJSON
Índices geoespaciais
Índice 2dsphere
db.places.createIndex({ location: "2dsphere" })
Características:
- obrigatório para GeoJSON
- calcula distância real (esfera da Terra)
- suporta todos os operadores modernos
Operadores geoespaciais
$near
Busca documentos mais próximos de um ponto.
db.places.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [-46.63, -23.55]
},
$maxDistance: 5000
}
}
})
- ordena automaticamente por distância
- distância em metros
- exige índice
2dsphere
$geoNear (aggregation)
Versão avançada dentro do pipeline.
db.places.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [-46.63, -23.55]
},
distanceField: "distancia",
maxDistance: 5000,
spherical: true
}
}
])
Características:
- calcula distância
- permite combinar com outros estágios
- deve ser o primeiro estágio do pipeline
$geoWithin
Busca documentos dentro de uma área.
Círculo:
db.places.find({
location: {
$geoWithin: {
$centerSphere: [
[-46.63, -23.55],
5 / 6378.1
]
}
}
})
Polígono:
db.places.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [[
[-46.65, -23.55],
[-46.60, -23.55],
[-46.60, -23.50],
[-46.65, -23.50],
[-46.65, -23.55]
]]
}
}
}
})
$geoIntersects
Busca documentos que intersectam uma geometria.
db.places.find({
location: {
$geoIntersects: {
$geometry: {
type: "Point",
coordinates: [-46.63, -23.55]
}
}
}
})
Uso comum:
- verificar se ponto está dentro de uma área
- cruzamento de regiões
Comparação dos operadores
| Operador | Descrição |
|---|---|
$near | busca por proximidade |
$geoNear | proximidade com aggregation |
$geoWithin | dentro de área |
$geoIntersects | interseção |
Boas práticas
-
sempre utilizar
2dsphere -
garantir índice no campo geoespacial
-
reduzir dataset antes da operação (usar
$match) -
evitar polígonos muito grandes
-
entender unidades:
- metros (
$near) - radianos (
$centerSphere)
- metros (
Exemplo completo
db.places.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [-46.63, -23.55]
},
distanceField: "dist",
maxDistance: 3000,
spherical: true
}
},
{
$match: {
category: "restaurant"
}
},
{
$project: {
name: 1,
dist: 1
}
}
])