Как мне выполнить геопространственный запрос в Монго? - PullRequest
6 голосов
/ 31 декабря 2010

В документации сказано, что по умолчанию Mongo рассматривает его как широта / долгота:

По умолчанию индекс предполагает, что вы индексируете широту / долготу, и поэтому настроен на [-180..180] диапазон значений.

Итак, допустим, у меня в документе есть это:

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

Я гарантирую свой индекс:

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

Теперь, как мне выполнить следующее в Монго?

  • Дайте мне все документы, которые находятся в пределах 5 миль от определенного широты / длины
  • Дайте мне все документы в пределах 400 метров отопределенный лат / лонг

1 Ответ

6 голосов
/ 31 декабря 2010

Используйте $near в сочетании с $maxDistance:

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

Единица $maxDistance совпадает с полем loc, то есть в градусах. Степень составляет приблизительно 69 миль или 111 км на экваторе, если я правильно помню (но на других широтах она меньше, точное расстояние трудно вычислить).

Чтобы получить больше информации о возвращенных местоположениях, вы можете использовать команду geoNear, которая, помимо прочего, сообщит вам расстояние до всех возвращенных коллекций. Смотри http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand

Я думаю, вы также можете использовать $geoWithin для решения вашей проблемы:

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

Это должно найти все местоположения внутри круга с центром в (50, 50) с радиусом 5/3959 градусов (т.е. 5 миль).

...