Skip to main content

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:

  • Point
  • LineString
  • Polygon
  • MultiPoint
  • MultiPolygon

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

OperadorDescrição
$nearbusca por proximidade
$geoNearproximidade com aggregation
$geoWithindentro de área
$geoIntersectsinterseçã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)

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
}
}
])