MongoDB中使用$ near运算符的反向距离顺序

时间:2016-02-23 08:46:58

标签: mongodb mongodb-query aggregation-framework

根据MongoDB documentation $ near运算符按距离排序:

  

$靠近距离排序文件

按顺序,单词中最接近参考点的是返回的第一个元素。

有没有办法保留订单?我的意思是,先退回最远的元素。

1 个答案:

答案 0 :(得分:4)

确定有一种方法可以首先返回最远的元素,即将$geoNear与聚合框架一起使用。但是当然有一个" catch",因为你所要求的实际上是这种搜索功能通常用于什么的对立面。

作为最初的管道阶段,它的工作是通过强制预测的距离"返回结果。来自查询点的字段。然后,这允许您添加一个$sort管道阶段,该阶段将返回"距离"在"降序"。当时是最大的"因此"最远"距离点的距离。

基本上是这样的形式,并注意到" catch":

db.collection.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [longitude,latitude]
        },
        "spherical": true,
        "distanceField": "distance",
        "limit": 999999                  // <-- That's the one!
    }},
    { "$sort": { "distance": -1 } }
])

所以,当你看到你看到"near"选项应该是自我解释时,以及"spherical"当然在&#34; 2d&#34;之间进行切换。和&#34; 2dsphere&#34;索引。还提到了这里需要的"distanceField",它将是文档中写入计算距离的路径。但还有一个重要的选项。

如上所述,一般意图是最近,因此这种性质的大多数查询最好只返回确实&#34;最近&的数据的子集。 #34; 到查询点。这意味着要返回的文档"limit"。查看文档将揭示典型的&#34;默认&#34; 100。

因为这个想法是反向的情况,那么您应该定位的是一个比集合中的总文档更大的数字。这将允许整个集合由管道阶段检查,从而产生每个文档的计算距离。当然,它只需要$sort即可完成它并将文件退回到最远的地方&#34;顺序。

这是最佳的吗?当然,这不是正确的,因为你只是要求与&#34; near&#34; 的含义完全相反。如果有一个&#34;内置&#34; $far$geoFar运算符,那么我们可以期待不同。

但这是一个过程。也许如果你看似即将到来的&#34;让我尽可能远离这里!&#34; 应用程序确实引起了世界的轰动,那么也许我们都会想到这些与你同行。