MongoDB GeoNear的结果除了距离以外的其他东西?

时间:2011-03-31 17:05:58

标签: sorting mongodb indexing geospatial mongodb-php

我正在开发一个PHP应用程序,我们需要在某个边界内检索结果,但是按结果的创建日期排序,而不是距离。我认为MongoDB的geoNear命令对此很有用,因为它负责计算每个结果的距离。但是,我想知道是否有办法通过create_date属性指定排序,而不是距离。理想情况下,我会创建坐标的复合键索引并创建日期,然后快速检索按创建日期排序的特定区域中的所有结果。

这可能,或者我必须在查询后进行排序吗?

2 个答案:

答案 0 :(得分:5)

  

但是,我想知道是否有办法通过create_date属性指定排序,而不是距离......

如果您正在使用$near命令,那么您必须先按距离排序,否则“近”的概念确实没有任何意义。在地球上,一切都可以“接近”给定点,这只是一个“多近”的问题。

这里有两个选项:

  1. 限制$near
  2. 的结果
  3. 使用$within命令
  4. 我认为您正在寻找的是$within命令

    center = [50, 50]
    radius = 10
    db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}})
    

    然后您可以通过其他键对其进行排序:

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

    但是,within命令可能会提供太多结果,因此您可能需要设置一些逻辑来限制$within返回的项目数。

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

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

答案 1 :(得分:2)

我现在知道你不能改变默认排序,因为它是在$ near命令内部完成的。

来自documentation的一些说明:

  

db.places.find({loc:{$ near:   [50,50]}})   上面的查询找到   最近的点(50,50)和   返回它们按距离排序(那里   不需要额外的那种   参数)。使用limit()指定   要返回的最大点数(a   默认限制为100适用于   未指定的):

所以你应该加载按距离排序的集合,而不是按照客户想要的顺序加载。

还有一个注意事项:如果您希望按结果排序的日期排序,您可以照常使用sort( { date : -1 } )进行排序。