【问题标题】:Sorting MongoDB GeoNear results by something other than distance?按距离以外的方式对 MongoDB GeoNear 结果进行排序?
【发布时间】:2011-07-27 02:09:34
【问题描述】:

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

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

【问题讨论】:

    标签: sorting mongodb indexing geospatial mongodb-php


    【解决方案1】:

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

    来自documentation的一些笔记:

    db.places.find( { loc : { $near : [50,50] } } ) 上面的查询发现 最接近 (50,50) 的点和 返回它们按距离排序(有 不需要额外的排序 范围)。使用 limit() 指定一个 返回的最大点数(a 默认限制为 100,如果 未指定):

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

    另一个注意事项:如果您想在按距离排序的结果中按日期排序,您可以像往常一样使用sort( { date : -1 } )

    【讨论】:

      【解决方案2】:

      但是,我想知道是否有一种方法可以通过 create_date 属性而不是距离来指定排序...

      如果您使用$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 命令可能会提供过多的结果,因此您可能需要添加一些逻辑来限制$within 返回的项目数。

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

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

      【讨论】:

      • 我认为你错了,一般情况下,你可以将广告排序到 $near,但这是 mongodb 中的一个错误,解决方法是 $within :jira.mongodb.org/browse/SERVER-856