具有限制的Mongo边界框查询

时间:2015-03-12 17:27:38

标签: python mongodb pymongo

我们正在使用mongo(通过pymongo)在我们的系统中存储点数据库。这些数据是通过我们的api使用边界框查询($ geoWithin)返回的。

我们希望将返回的结果数量限制为从中心排序的200。我正试图找出最好的方法来做到这一点。目前,我们获得所有项目(无限制)。然后,我们计算python中的距离和排序。但是,对于大型数据集而言,这些计算速度非常慢且占用大量内存。

有人有更好的建议吗?我在其他SO问题中看到,无法对边界框查询进行排序。但是,大多数问题都是2岁以上。

1 个答案:

答案 0 :(得分:2)

好吧,我想我找到了一个解决方案。事实证明,您可以在同一查询中使用点/半径和边界框。

    # do both a bounding box and point query
    # point query should conatain the entire bbox
    # this provides sorting and distance calculations
    max_distance = int(haversine(sw_lat, sw_lon, self.centroid.y, self.centroid.x))
    self.new_query = {
        '$and': [
            {'point': {
                '$geoWithin': {"$box": box }
            }},
            {'point': OrderedDict([
                ('$geoNear', {
                    '$geometry':  {
                        'type': 'Point' ,
                        'coordinates': [self.geo.centroid.coords[0], self.geo.centroid.coords[1]]
                    },
                    '$maxDistance': max_distance
                }),

            ])}
        ]
    }