我正在使用mongodb-engine从Django项目访问MongoDB。正常的获取,插入和更新工作得很好,但现在我想使用geoNear功能。我只是想办法从Django中调用它。
我尝试了MyModel.objects.raw(...)
和MyModel.objects.raw_query(...)
,但结果并不像预期的那样。
查询将是这样的(它可以在Mongo shell中运行)
db.runCommand({ geoNear : "mymodel", near : [3, 0], spherical : true, maxDistance : 10 })
该模型使用MongoDBManager
class MyModel(model.Model):
objects = MongoDBManager()
...
有没有人成功尝试过?
Thx Simon
答案 0 :(得分:3)
我猜想使用当前版本的mongodb-enginge,使用geoNear查询所需的MongoDB db.runCommand()
是不可能的。我现在正在使用具有常规近似语法的raw_query,并将自己的2个纬度/经度点之间的距离转换为英里(反之亦然)。
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])
答案 1 :(得分:1)
您可以按照http://django-mongodb.org/topics/lowerlevel.html#pymongo-level
中的说明获取PyMongo对象