除了距离之外,如何按照其他方式对MongoDB GeoNear结果进行排序?

4
我正在开发一个PHP应用程序,需要按照结果的创建日期而不是距离有序地检索特定边界内的结果。我认为MongoDB的geoNear命令非常适合此任务,因为它可以计算每个结果的距离。但是,我想知道是否有一种方法可以指定按create_date属性而不是距离排序。理想情况下,我将创建一个包含坐标和创建日期的复合键索引,然后快速检索按创建日期排序的特定区域中的所有结果。
这是否可行,还是必须在查询后进行排序?
2个回答

5
然而,我想知道是否有一种方法可以指定按 create_date 属性排序,而不是按距离排序...如果你正在使用 $near 命令,则必须先按距离排序,否则 "near" 的概念就没有任何意义。在地球上,每个东西都可以“靠近”给定的点,只是问题在于“多靠近”。这里有两个选项:1. 限制 $near 的结果;2. 使用 $within 命令。我认为你要找的是 $within 命令。
center = [50, 50]
radius = 10
db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}})

您可以按其他关键字对它们进行排序:
db.places.find(...).sort({created:1})

然而,$within 命令可能会返回过多的结果,因此您可能需要加入一些逻辑来限制返回的项目数量。

db.places.find(...).limit(50).sort({created:1})

事实上,如果你达到了特定的限制,你的$within命令的值通常会开始下降。你的客户端代码可能想要检查是否达到了最大结果。


我认为你错了,通常情况下,你可以在 $near 中添加排序,但这是 MongoDB 中的一个 bug,解决方法是使用 $within: https://jira.mongodb.org/browse/SERVER-856 - Aysennoussi

2

据我所知,你现在无法更改默认排序,因为它在 $near 命令中内部完成。

以下是来自文档的一些注释:

db.places.find( { loc : { $near : [50,50] } } ) 上述查询查找距离 (50,50) 最近的点,并按距离排序返回(不需要额外的排序参数)。使用 limit() 指定要返回的最大点数(如果未指定,默认限制为100):

因此,您应该通过距离排序加载集合,然后在客户端上按您想要的任何内容进行排序。

还有一点需要注意:如果您想按日期对按距离排序的结果进行排序,可以像通常一样使用 sort({ date: -1 })


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接