MongoDB排序地理边界框

MongoDB排序地理边界框,mongodb,geospatial,Mongodb,Geospatial,有了MongoDB,可以执行边界查询(在一个框中)并从中心点对结果进行排序,然后让它们与距离计算一起返回 我意识到使用半径进行近距离计算可以为我提供一个距离有序集,但我想我正在尝试确定它是否可能在一个盒子而不是一个圆内进行。不幸的是,这不可能完全如您所述。根据“地理空间索引”文档的“边界查询”部分:“查询中的结果不按距离排序” 有一些可能的解决办法 1) 您可以执行$INTERNAIN查询,并让应用程序计算从框中心返回的每个点的距离 2) 您可以首先在查询中执行$in,将点保存在数组中,然后运

有了MongoDB,可以执行边界查询(在一个框中)并从中心点对结果进行排序,然后让它们与距离计算一起返回


我意识到使用半径进行近距离计算可以为我提供一个距离有序集,但我想我正在尝试确定它是否可能在一个盒子而不是一个圆内进行。

不幸的是,这不可能完全如您所述。根据“地理空间索引”文档的“边界查询”部分:“查询中的结果不按距离排序”

有一些可能的解决办法

1) 您可以执行$INTERNAIN查询,并让应用程序计算从框中心返回的每个点的距离

2) 您可以首先在查询中执行$in,将点保存在数组中,然后运行$near查询并在[]中运行$in查询

比如说,

想象一个有[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 ] }
首先,完成$INTERNAIN查询,并保存返回的点:

> 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 ] }
上述解决方案取自谷歌集团提出的一个类似问题: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969


希望这将允许您执行需要执行的操作。

@nick-Marc不正确。这是可能的。这里似乎也有类似的问题:

秘密在于将点半径查询与边界框查询结合起来。您可以同时获得这两者的所有好处(排序、距离和性能)