Precio vs distancia con $geoNear en MongoDB

Resumen

¿Las propiedades cerca de Central Park son realmente más caras? Con el operador $geoNear de MongoDB puedes responder esa pregunta combinando geolocalización, filtros y agrupaciones en un solo pipeline. Aquí te muestro cómo construirlo paso a paso para validar hipótesis de precio basadas en distancia, ideal si trabajas con datos inmobiliarios o cualquier dataset georreferenciado.

Por qué calcular el precio por cama cambia el análisis

Un departamento con ocho camas casi siempre costará más que uno con una sola, así que comparar precios brutos distorsiona cualquier conclusión sobre ubicación. Por eso el primer ajuste del pipeline consiste en normalizar el precio dividiéndolo entre el número de camas. Así obtienes una métrica comparable: cuánto cuesta cada cama según qué tan cerca esté la propiedad del punto de referencia.

¿Qué hace el operador $geoNear en MongoDB? Calcula la distancia entre un punto dado y los documentos de una colección con datos geoespaciales, devolviendo los resultados ordenados por proximidad. Debe ir siempre como primera etapa del pipeline.

Cómo construir el pipeline paso a paso en MongoDB Compass

La estrategia es encadenar cinco etapas para pasar de coordenadas crudas a una respuesta clara sobre el efecto de la distancia en el precio.

Qué hace cada etapa del aggregation framework

  • $geoNear: primera etapa obligatoria, calcula la distancia desde el punto de referencia (Central Park) hacia cada propiedad y la guarda en un campo distance.
  • $match: filtra documentos donde el campo beds sea distinto de cero, evitando divisiones por cero en el siguiente paso.
  • $project: transforma los datos creando un campo priceK con el resultado de dividir el precio entre el número de camas, usando el operador $divide con un array de dos elementos.
  • $group: agrupa los resultados con una condicional $cond que evalúa si la distancia es menor o igual a 2000 metros.
  • $avg: calcula la media del precio por cama dentro de cada grupo.

La magia ocurre en la condicional dentro de $group. En lugar de agrupar por un campo fijo, el _id se construye con un if/then/else: si la distancia es menor o igual a dos kilómetros, el grupo se llama menos de 2km; en caso contrario, más de 2km. Resultado: dos documentos finales que muestran la media de precio por cama en cada zona.

Qué errores comunes evitar al anidar objetos

Un descuido típico cuando trabajas con muchos objetos anidados es olvidar las llaves que delimitan cada objeto en JSON. Si Compass te marca un error en $group, revisa que tanto la apertura como el cierre estén bien colocadas, porque esa es la forma en que el motor reconoce un objeto válido.

¿Por qué $geoNear debe ir primero en el pipeline? Porque es la única etapa que puede acceder a los índices geoespaciales para calcular distancias. Si la pones después de otra etapa, el pipeline falla.

Qué revela el resultado sobre la relación entre distancia y precio

Al ejecutar el pipeline obtienes exactamente dos documentos. Uno agrupa todas las propiedades dentro del radio de dos kilómetros con su precio medio por cama, y el otro hace lo mismo con las que están más allá. La comparación a simple vista confirma la hipótesis: mientras más cerca de Central Park, más alto el precio por cama.

Este enfoque de agrupar en dos cubetas en lugar de listar resultados individuales es lo que hace el análisis legible. Estás traduciendo cientos de documentos en una sola comparación numérica.

¿Qué formato deben tener los datos para usar $geoNear? Deben seguir la especificación GeoJSON, con un campo de tipo Point y coordenadas en formato [longitud, latitud]. Sin ese formato, el operador no funciona.

Cómo aplicar este patrón a otros casos de análisis geoespacial

El mismo pipeline sirve para responder preguntas distintas si cambias el punto de referencia y los criterios de agrupación. Por ejemplo, podrías investigar qué características tienen las propiedades cercanas a la costa frente a las que están en la montaña o en el llano. ¿Tienen más amenidades? ¿Incluyen piscina o acceso a playa? ¿Cambia el tipo de huésped que las reserva?

Te propongo este reto: arma un pipeline que filtre propiedades a corta distancia de un punto costero y compare sus facilidades con las del interior. Comparte tus hallazgos y el código de tu pipeline en los comentarios para discutirlos.