Использование MongoDB runCommand с Django MongoDb-engine

Я использую mongodb-engine для доступа к MongoDB из проекта Django. Обычные операции get, insert и update работают довольно хорошо, но теперь я бы хотел использовать функциональность geoNear. Я просто не могу придумать, как это назвать от Джанго.

я пытался MyModel.objects.raw(...) а также MyModel.objects.raw_query(...), но результат не совсем так, как ожидалось.

Запрос будет примерно таким (он работает из оболочки Mongo)

db.runCommand({ geoNear : "mymodel", near : [3, 0], spherical : true, maxDistance : 10 })

И модель использует MongoDBManager

class MyModel(model.Model):
    objects = MongoDBManager()
    ...

кто-нибудь успешно пробовал это?

Спасибо Саймон

2 ответа

Решение

Я предполагаю использование MongoDB db.runCommand(), что необходимо для запросов с geoNear, просто невозможно в текущей версии mongodb-enginge. Сейчас я использую raw_query с нормальным синтаксисом вблизи и преобразую расстояние между двумя точками широты / долготы в мили (и наоборот).

lat_lon_dist = distance_to_lat_long(dist_in_miles)
l = Listing.objects.raw_query({
                       'geo_location' : {
                                     '$maxDistance': lat_lon_dist,
                                     '$near' : { 'latitude': lat, 'longitude': lon },
                                     }
                       })
...
EARTH_RADIUS = { 
                'km': 6371, 
                'mi': 3959 
                }

''' returns the distance between two lat/lon points in miles or kilometers '''
def lat_lon_to_distance(lat1, lon1, lat2, lon2, unit='mi'):
    lat1 = math.radians(lat1)
    lon1 = math.radians(lon1)
    lat2 = math.radians(lat2)
    lon2 = math.radians(lon2)
    return math.acos(math.sin(lat1)*math.sin(lat2) + 
                  math.cos(lat1)*math.cos(lat2) *
                  math.cos(lon2-lon1)) * EARTH_RADIUS[unit];

'''
converts a distance in miles or kilometer to a difference between two lat/lon points
the result is just approximately!
'''
def distance_to_lat_long(distance, unit='mi'):
    return distance / math.radians(EARTH_RADIUS[unit])

Вы можете получить объекты PyMongo, как описано здесь http://django-mongodb.org/topics/lowerlevel.html

Другие вопросы по тегам