2010-12-31 23 views
6

En la documentación, se dice que, por defecto, Mongo lo trata como latitud/longitud:¿Cómo ejecuto una consulta geoespacial en Mongo?

Por defecto, el índice supuesto que se va indexación de latitud/longitud y es así configurado para un [-180. .180] rango de valores.

tanto, vamos a decir que tengo esto en mi documento:

post['loc'] = [ -40.234, 56.222] 
db.mycollection.save(post) 

me aseguro de mi índice:

db.mycollection.ensureIndex({"loc":"2d"}) 

Ahora, ¿cómo puedo ejecutar lo siguiente en Mongo?

  • Dame todos los documentos que se encuentran dentro de 5 millas de una cierta latitud/longitud
  • Dame todos los documentos a menos de 400 metros de una cierta latitud/longitud

Respuesta

6

Uso $near en conjunción con $maxDistance:

db.mycollection.find({loc: {$near: [50, 50], $maxDistance: 5}}) 

la unidad de $maxDistance es el mismo que el campo loc, es decir, grados. Un grado es de aproximadamente 69 millas o 111 km en el ecuador, si no recuerdo mal (pero es menor en otras latitudes, la distancia exacta es difícil de calcular).

Para obtener más información sobre las ubicaciones devueltas, puede utilizar el comando geoNear, que le informará la distancia de todas las colecciones devueltas, entre otras cosas. Veo http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand

Creo que también se puede utilizar $geoWithin para resolver su problema:

db.mycollection.find({loc: {$geoWithin: {$center: [[50, 50], 5/3959]}}}) 

Esto debe encontrar todos los lugares dentro del círculo centrado en (50, 50) con un radio de 5/3959 grados (es decir, 5 millas).

+0

¡Eres el mejor! – Ali

Cuestiones relacionadas