【问题标题】:Using MongoDB runCommand with Django MongoDb-engine将 MongoDB runCommand 与 Django MongoDb-engine 一起使用
【发布时间】:2012-08-22 00:34:28
【问题描述】:

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

有人成功尝试过吗?

谢谢西蒙

【问题讨论】:

    标签: django mongodb geolocation django-mongodb-engine


    【解决方案1】:

    我猜想使用 geoNear 查询所需的 MongoDB db.runCommand() 在当前版本的 mongodb-enginge 中是不可能的。我现在使用具有正常近语法的 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])
    

    【讨论】:

      【解决方案2】:

      您可以按照此处所述获取 PyMongo 对象http://django-mongodb.org/topics/lowerlevel.html#pymongo-level

      【讨论】:

      • 问题是,与使用 db.mycollection.find() 运行的“普通”查询相比,我想使用使用 db.runCommand() 调用的 geoNear 命令。 geoNear 将返回到中心的距离,并解释地球的圆形形状。看这里:mongodb.org/display/DOCS/Geospatial+Indexing/…
      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多