2013-09-21 2 views
3

Недавно я обновил монгольскую версию MongoDB с версии 2.2.1 до версии 2.4.6 и pymongo до версии 2.6.2.Геопространственный запрос MongoDB/PyMongo: расстояние между документами от точки

Одной из причин обновления является возможность новой версии MongoDB рассчитать и вернуть расстояние от документов (включая правильные координаты) от центра геопространственного запроса as explained here.

До сих пор я выполнить следующий запрос:

db.collection.find({"loc": {"$within": {"$center": [[LON, LAT], RADIUS]}}}) 

где LON, LAT и Radius являются собственные числа. Затем я программно вычисляю расстояние от центра для каждого возвращаемого документа.

Теперь я пытаюсь, чтобы MongoDB выполнял расчет расстояний от моего имени, из-за большей эффективности по сравнению с моим кодом.

То, что я пытаюсь сейчас следующий:

db.collection.find({"loc": {"$geoWithin": {"$centerSphere": [[LON, LAT], RADIUS]}}}) 

где RADIUS теперь рассчитываются правильно (радиус в км/6371), но я получаю те же результаты, что и старший запрос.

Как мне изменить новый запрос, чтобы получить дополнительное поле «dis» для каждого документа?

Геопространственный индекс - 2D, который должен работать в соответствии с документами, но при необходимости я могу изменить его на 2dsphere. Кто-нибудь имеет хорошее предложение?

ответ

3

Попробуйте использовать команду $ geoNear в структуре агрегации. Документация $ geoNear здесь:

http://docs.mongodb.org/manual/reference/aggregation/geoNear/

Ваш запрос будет в конечном итоге выглядит как:

db.collection.aggregate([{$geoNear:{near:[LON,LAT],distanceField:"distance",maxDistance:RADIUS,spherical:true}}]) 

и результирующие документы будут иметь поле с именем «расстояние» с расчетным значением. Надеюсь, это поможет.

+0

спасибо. «Сферическое: истинное» означает, что индекс также должен быть изменен на 2dsphere? – user1981924

+1

сферический: true указывает, что расчет радиуса выполняется на сферической поверхности в противоположность плоской плоскости. Если индекс имеет тип «2dsphere», вы должны использовать сферическую: true. Если индекс имеет тип «2d», вы можете использовать либо сферическое: истинное, либо сферическое: false. – jribnik

Смежные вопросы