Geospatial queries en MongoDB con 2dsphere | Nicolás Garzón
2dsphere
2d
JavaScript
Copiar {
location : {
type : 'Point' ,
coordinates : [ - 74.0721 , 4.711 ]
}
} GeoJSON usa longitud primero y latitud después . Invertir el orden es uno de los errores más frecuentes.
JavaScript
Copiar db. stores. createIndex ( { location : '2dsphere' } ) ; Permite consultas sobre una esfera aproximada y operadores como $near, $geoWithin y $geoIntersects.
Busca resultados ordenados por proximidad:
JavaScript
Copiar db. stores. find ( {
businessId,
location : {
$near : {
$geometry : {
type : 'Point' ,
coordinates : [ longitude, latitude]
} ,
$maxDistance : 5000
}
}
} ) . limit ( 20 ) ; $maxDistance se expresa en metros con GeoJSON y 2dsphere. Verifica siempre unidades en la API.
Busca geometrías contenidas dentro de otra:
JavaScript
Copiar db. stores. find ( {
location : {
$geoWithin : {
$geometry : {
type : 'Polygon' ,
coordinates : [ [
[ - 74.12 , 4.65 ] ,
[ - 74.02 , 4.65 ] ,
[ - 74.02 , 4.75 ] ,
[ - 74.12 , 4.75 ] ,
[ - 74.12 , 4.65 ]
] ]
}
}
}
} ) ; El anillo debe cerrarse repitiendo el primer punto al final.
Devuelve geometrías que intersectan la geometría consultada. Es útil para zonas de cobertura, rutas y polígonos administrativos.
JavaScript
Copiar db. deliveryZones. find ( {
area : {
$geoIntersects : {
$geometry : point
}
}
} ) ; En aggregation, $geoNear calcula distancia y normalmente debe ser el primer stage:
JavaScript
Copiar db. stores. aggregate ( [
{
$geoNear : {
near : {
type : 'Point' ,
coordinates : [ longitude, latitude]
} ,
key : 'location' ,
distanceField : 'distanceMeters' ,
maxDistance : 5000 ,
spherical : true ,
query : {
businessId,
active : true
}
}
} ,
{ $limit : 20 }
] ) ; Incluye tenant y filtros selectivos en query cuando sea compatible.
Point;
LineString;
Polygon;
MultiPoint;
MultiLineString;
MultiPolygon.
La geometría debe cumplir estructura y cierre correctos. Un documento JSON válido no necesariamente contiene una geometría válida.
Valida antes de persistir:
TypeScript
Copiar if ( longitude < - 180 || longitude > 180 ) throw new Error ( 'Invalid longitude' ) ;
if ( latitude < - 90 || latitude > 90 ) throw new Error ( 'Invalid latitude' ) ;
tipo GeoJSON;
profundidad de arrays;
polígonos cerrados;
ausencia de NaN;
sistema de referencia esperado;
tamaño máximo de geometría;
reglas de negocio.
La distancia geodésica no considera calles, tráfico, puentes o sentidos. Para logística:
Texto
Copiar MongoDB geospatial
→ candidatos cercanos
servicio de rutas
→ tiempo y distancia real por carreteraNo prometas tiempos de entrega basados solo en línea recta.
JavaScript
Copiar {
branchId,
businessId,
area : {
type : 'Polygon' ,
coordinates : [ ]
} ,
active : true
} Consulta un punto contra zonas. Debes definir:
qué ocurre en el borde;
zonas superpuestas;
prioridad;
huecos interiores;
cambios de versión;
historial de cobertura.
Un índice geoespacial puede combinarse con otros campos bajo restricciones:
JavaScript
Copiar db. stores. createIndex ( {
businessId : 1 ,
location : '2dsphere'
} ) ; Confirma con explain() que el query shape obtiene el targeting esperado. El orden y compatibilidad dependen del tipo de consulta.
La ubicación puede ser dato sensible. Aplica:
minimización de precisión;
retención limitada;
autorización;
cifrado en tránsito y reposo;
auditoría;
no registrar coordenadas innecesariamente;
consentimiento cuando corresponda.
Para analytics quizá baste una zona o geohash aproximado, no la ubicación exacta.
densidad de puntos;
radio de búsqueda;
tamaño y complejidad de polígonos;
filtros adicionales;
número de resultados;
distribución geográfica;
sharding.
Una consulta de radio enorme puede devolver gran parte de la colección.
Las consultas geoespaciales en clusters sharded tienen restricciones y costes dependientes de versión, shard key y operador. Revisa compatibilidad antes de diseñar una API crítica. La ubicación no siempre es una buena shard key por distribución y cambios.
El punto aparece en otra región del mundo.
El código interpreta kilómetros como metros.
La query falla o produce resultados inesperados.
Debe probarse la semántica del operador.
Necesita modelado cuidadoso.
Decide si el documento se excluye o se procesa aparte.
GPS y geocoding tienen error; no trates centímetros como certeza.
usar [lat, lng] en vez de [lng, lat];
olvidar índice geoespacial;
no limitar radio ni resultados;
confundir distancia recta con ruta;
aceptar geometría arbitraria del cliente;
registrar ubicación sensible;
no probar bordes y polígonos superpuestos.
Prueba puntos conocidos.
Verifica orden de coordenadas.
Prueba radios pequeños y grandes.
Confirma unidades.
Valida polígonos y bordes.
Ejecuta explain().
Mide densidad urbana y rural.
Prueba zonas superpuestas.
Revisa privacidad y retención.
Confirma compatibilidad de versión y sharding.
Las consultas geoespaciales requieren más que almacenar dos números. Debes elegir geometría, índice, operador, unidades y reglas de borde. MongoDB resuelve proximidad e intersección; no sustituye un motor de rutas ni una política de privacidad.
Comprueba lo aprendido
¿Cuál es el orden de coordenadas GeoJSON?
¿Qué diferencia existe entre $near y $geoWithin?
¿Por qué distancia geodésica no equivale a tiempo de entrega?
¿Qué debe validarse en un Polygon?
¿Qué riesgos de privacidad existen?
¿Qué probarías en zonas superpuestas?
Query planner y execution plans.