【发布时间】:2012-04-03 16:39:51
【问题描述】:
使用 MongoDB 有一种方法可以执行边界查询(在一个框内)并从中心点对结果进行排序,并让它们通过距离计算返回..
我意识到用半径进行近距离可以为我提供一个距离有序集,但我想尝试确定它是否可能在一个盒子而不是一个圆圈内。
【问题讨论】:
标签: mongodb geospatial
使用 MongoDB 有一种方法可以执行边界查询(在一个框内)并从中心点对结果进行排序,并让它们通过距离计算返回..
我意识到用半径进行近距离可以为我提供一个距离有序集,但我想尝试确定它是否可能在一个盒子而不是一个圆圈内。
【问题讨论】:
标签: mongodb geospatial
很遗憾,这不可能完全按照您的描述进行。根据“地理空间索引”文档的“边界查询”部分:“[$within 查询的结果] 不按距离排序” http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries
有几种可能的解决方法。
1) 您可以执行 $within 查询并让您的应用程序计算从框中心返回的每个点的距离。
2) 您可以先执行 $within 查询,将点保存在数组中,然后结合 $in [] 运行 $near 查询。
例如,
想象一个边界为 [0,0] 和 [8,8] 的框:
> var box = [ [ 0, 0 ], [ 8, 8 ] ]
还有几点:
> db.points.find()
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] }
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] }
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] }
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] }
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] }
{ "_id" : 6, "name" : "f", "loc" : [ 9, 4 ] }
首先完成 $within 查询,并保存返回的点:
> var c = db.points.find({loc:{$within:{"$box":box}}})
> var boxResults = []
> while(c.hasNext()){boxResults.push(c.next().loc)}
然后将 $near 查询与 $in 查询结合起来:
> db.points.find({loc:{$near:[4,4], $in:boxResults}})
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] }
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] }
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] }
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] }
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] }
上述解决方案取自 Google Groups 上提出的类似问题: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969
希望这将允许您执行您需要执行的操作。
【讨论】:
@nick - Marc 不正确。有可能的。似乎在这里提出了类似的问题:Mongo Bounding Box Query with Limit
秘诀是将点半径查询与边界框结合起来。您可以获得两者的所有好处(排序、距离、性能)。
【讨论】: