Использование 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