Consultas geoespaciales con geoNear en MongoDB

Resumen

Buscar propiedades por cercanía a un punto en el mapa es una de las funcionalidades más potentes de MongoDB, y el operador geoNear del Aggregation Framework lo hace posible con pocas líneas. Aquí aprenderás a configurarlo paso a paso usando datos reales de Airbnb y coordenadas de Central Park.

¿Qué son las coordenadas georreferenciadas y cómo las maneja MongoDB?

Una coordenada georreferenciada es un dato espacial que se superpone como capa sobre un mapa de bits, igual que ocurre cuando exploras propiedades en Airbnb o ves capas de tráfico, restaurantes y hoteles en Google Maps. Esa capa de datos es la que puedes consultar.

MongoDB soporta de forma nativa el formato GeoJSON, un estándar que representa datos espaciales como puntos, líneas o polígonos. En la base de Airbnb, cada propiedad guarda dentro de address.location un objeto GeoJSON con type: "Point" y un array coordinates.

¿Qué es GeoJSON? Es un formato estándar para representar datos geográficos como puntos, líneas y polígonos. MongoDB lo usa de forma nativa para hacer consultas espaciales sin necesidad de extensiones externas.

Un detalle que confunde a muchos: MongoDB espera el array de coordenadas en orden longitud primero, latitud después. Si los inviertes, la consulta apuntará a otro lugar del planeta.

¿Cómo configurar el operador geoNear en el pipeline de Aggregation? [03:30]

El objetivo es claro: a partir de un punto fijo en el mapa, listar las propiedades cercanas dentro de un radio máximo y calcular la distancia de cada una. Para eso, $geoNear debe ir como primera etapa del pipeline, no funciona en otra posición.

El operador necesita varias llaves obligatorias:

  • near: el punto de referencia, expresado como un objeto GeoJSON con type: "Point" y coordinates: [longitud, latitud].
  • distanceField: el nombre del campo donde MongoDB guardará la distancia calculada para cada documento, por ejemplo distancia.
  • maxDistance: el radio máximo de búsqueda, expresado en metros. Para una ciudad grande, 30 kilómetros equivalen a 30000.
  • spherical: si lo pones en true, usa cálculo esférico, más preciso pero más costoso en recursos.

En la práctica, eliges un punto en Google Maps, copias sus coordenadas con clic derecho y las pegas invirtiendo el orden para que la longitud quede primero.

¿Por qué usar spherical en true?

La Tierra no es plana, y cuando calculas distancias entre puntos reales, un cálculo plano introduce errores que crecen con la distancia. El cálculo esférico considera la curvatura del planeta y entrega resultados precisos para casos de uso reales como búsquedas inmobiliarias o logística.

Sí consume más recursos, pero la precisión vale la pena cuando trabajas con coordenadas reales.

¿En qué unidad trabaja geoNear? Trabaja en metros. Si quieres un radio de 30 kilómetros, debes escribir 30000 en maxDistance.

¿Qué resultado entrega geoNear y qué sigue después?

Al ejecutar el pipeline sobre la muestra de aproximadamente 5600 documentos de Airbnb, geoNear devuelve solo aquellas propiedades que están dentro de los 30 kilómetros del punto seleccionado en Central Park, Nueva York. Cada documento incluye un nuevo campo distancia con el valor calculado.

El listado bruto no dice mucho a simple vista. Para responder la pregunta real, si las propiedades cercanas a Central Park son más caras y bajan de precio a medida que te alejas, necesitas encadenar una etapa $project que muestre solo el precio y la distancia en un reporte limpio.

¿Por qué elegir un punto con datos reales?

La muestra contiene documentos al azar concentrados sobre todo en Estados Unidos. Si eliges un punto en una zona sin propiedades en la muestra, el pipeline devolverá un resultado vacío y parecerá que algo falla cuando en realidad solo es un tema de cobertura de datos.

Por eso conviene apoyarte en Google Maps para identificar una zona densa, como una esquina de Central Park, donde sabes que habrá coincidencias y donde además el costo de alquiler es notoriamente alto, lo que hace el experimento más interesante.

¿Has trabajado antes con búsquedas geoespaciales en otra base de datos? Cuéntame en los comentarios qué caso de uso te gustaría resolver con geoNear.