我正在开发一个PHP应用程序,我们需要在特定边界内检索结果,但是按结果的创建日期排序,而不是距离。我认为MongoDB的geoNear命令对此非常重要,因为它负责计算每个结果的距离。但是,我想知道是否有方法通过create_date属性指定排序,而不是距离。理想情况下,我将创建坐标的复合关键字索引并创建日期,然后快速检索按创建日期排序的特定区域中的所有结果。对MongoDB GeoNear结果进行排序而不是距离?
这是可能的,还是我必须做我的排序后查询?
我正在开发一个PHP应用程序,我们需要在特定边界内检索结果,但是按结果的创建日期排序,而不是距离。我认为MongoDB的geoNear命令对此非常重要,因为它负责计算每个结果的距离。但是,我想知道是否有方法通过create_date属性指定排序,而不是距离。理想情况下,我将创建坐标的复合关键字索引并创建日期,然后快速检索按创建日期排序的特定区域中的所有结果。对MongoDB GeoNear结果进行排序而不是距离?
这是可能的,还是我必须做我的排序后查询?
正如我现在所知,您不能更改默认排序,因为它在$ near命令内部完成。
从documentation一些注意事项:
db.places.find({LOC:{$邻近: [50,50]}}) 上面查询查找 最近点到(50, 50)和 返回它们按距离排序( 不需要额外的排序 参数)。使用限制()来指定点返回的 最大数量(100 默认限制适用如果 不详):
所以,你应该加载集合按距离排序,而不是为了通过任何你想要的客户端。
还有一点需要注意:如果你想在结果中按日期排序,按照日期排序,你可以照常使用sort({ date : -1 })
。
不过,我想知道是否有指定由CREATE_DATE属性排序,而不是距离的方式...
如果您使用的$near
命令,那么你必须先排序通过距离或“近”的概念没有任何意义。在地球上,一切都可以“靠近”某个特定点,这只是一个“多近”的问题。
你这里有两种选择:
$near
$within
命令我想你要找的是什么$within
命令
center = [50, 50]
radius = 10
db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}})
然后,您可以对SE其他一些关键:
db.places.find(...).sort({created:1})
然而,命令中可以提供过多的结果,所以你可能想要把一些逻辑来限制$within
返回的项目数。
db.places.find(...).limit(50).sort({created:1})
事实是,如果你打一个特定的限制,您$within
命令的值一般开始下降。您的客户端代码可能需要检查您是否达到了最大结果。
我认为你错了,通常情况下,你可以广告排序到$附近,但它是一个在MongoDB中的错误,解决方法是$内: https://jira.mongodb.org/browse/SERVER-856 – Sekai 2014-03-31 10:02:07