MongoDB - 没有排序的输出距离

Posted

技术标签:

【中文标题】MongoDB - 没有排序的输出距离【英文标题】:MongoDB - output distance without sorting 【发布时间】:2015-02-10 12:00:37 【问题描述】:

我是 MongoDB 新手,我正跳入地理空间查询的深水区。 我注意到geoNear 命令和$geoNear 聚合运算符可以输出计算出的距离(使用distanceField)。

命令和操作符也会按照距离对结果进行排序。

有没有办法输出距离而不按距离排序?即使用一些投影运算符。 这显然可以使用带有javascript函数的map手动计算距离来完成,但似乎有一个内置的距离计算函数必须更有效。 此外,使用$geoNear 运算符似乎效率低下,然后(在聚合管道中)处理结果......对吗?

谢谢

【问题讨论】:

【参考方案1】:

由于$geoNear 查询的 num 和 limit 参数(它们是互斥的——如果两者都存在,则 num 覆盖限制,请参阅docs),结果必须按距离排序以确定哪个要返回的。因此,事实上,在返回排序结果时没有做任何额外的工作。据我所知,无法返回未按距离排序的结果。

这在分片的情况下特别有意义,目前无法在geo key 上完成,因为查询必须发送到所有分片,然后根据 num 和/的值组合并返回结果或限制。

MongoDB 不像某些空间数据库那样使用 R-tree 索引,这可以使距离搜索更有效,但使用 geohash 上的 B-tree,因此距离查询可以通过比较最近的距离来工作象限,直到找到足够的数字,这可能大于 num 或 limit,然后在按距离排序后仅返回该数字。

【讨论】:

什么会更有效:db.collection.find(query).sort(sort).map( function(d) ...return-d-with-calculated-distance... )db.collection.aggregate([ $geoNear: distanceField: "...", ... , $match: query , $sort: sort ]) ?您还有其他方法可以将计算出的距离添加到结果中吗? 不测试我不知道,但总的来说,我认为编译函数与索引结合会击败 map-reduce。 我很惊讶没有办法:db.collection.find(query, projection-that-adds-a-distance-field) - 距离计算功能已经实现了! 好吧,正如你自己所说,总是有 map-reduce。查看 MongoDB 源代码,如果您有这种倾向,空间部分非常有趣。

以上是关于MongoDB - 没有排序的输出距离的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb启动命令mongod参数说明

Mongodb启动命令mongod参数说明

Mongodb启动命令mongod参数说明

MongoDB:考虑到多个字段,我如何按距离排序?

MongoDB:考虑到多个字段,我如何按距离排序?

Mongodb服务器无法启动