我正在开发一个PHP应用程序,需要按照结果的创建日期而不是距离有序地检索特定边界内的结果。我认为MongoDB的geoNear命令非常适合此任务,因为它可以计算每个结果的距离。但是,我想知道是否有一种方法可以指定按create_date属性而不是距离排序。理想情况下,我将创建一个包含坐标和创建日期的复合键索引,然后快速检索按创建日期排序的特定区域中的所有结果。
这是否可行,还是必须在查询后进行排序?
这是否可行,还是必须在查询后进行排序?
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 命令中内部完成。
以下是来自文档的一些注释:
db.places.find( { loc : { $near : [50,50] } } ) 上述查询查找距离 (50,50) 最近的点,并按距离排序返回(不需要额外的排序参数)。使用 limit() 指定要返回的最大点数(如果未指定,默认限制为100):
因此,您应该通过距离排序加载集合,然后在客户端上按您想要的任何内容进行排序。
还有一点需要注意:如果您想按日期对按距离排序的结果进行排序,可以像通常一样使用 sort({ date: -1 })
。