我们正在使用mongo(通过pymongo)在我们的系统中存储点数据库。这些数据是通过我们的api使用边界框查询($ geoWithin)返回的。
我们希望将返回的结果数量限制为从中心排序的200。我正试图找出最好的方法来做到这一点。目前,我们获得所有项目(无限制)。然后,我们计算python中的距离和排序。但是,对于大型数据集而言,这些计算速度非常慢且占用大量内存。
有人有更好的建议吗?我在其他SO问题中看到,无法对边界框查询进行排序。但是,大多数问题都是2岁以上。
答案 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
}),
])}
]
}