使用MongoDB runCommand和Django MongoDb-engine

时间:2012-08-22 00:34:29

标签: django mongodb geolocation django-mongodb-engine

我正在使用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

2 个答案:

答案 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对象