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



根据MongoDB文档,$near运算符按距离排序:

$near按距离对文档进行排序

在顺序词中,最接近查询中引用点的元素是返回的第一个元素。

有什么方法可以保留订单吗?我的意思是,首先返回最远的元素。

肯定有一种方法可以首先返回最远的元素,那就是将$geoNear与聚合框架一起使用。但是当然有一个"陷阱",因为您问的实际上是这种搜索功能通常用于什么的对立面。

作为初始管道阶段,它的工作是使用与查询点的强制性投影"距离"字段返回结果。然后,这允许您添加一个$sort管道阶段,该阶段将按"降序"返回"距离"。然后是离点"最大",因此"最远"的距离。

基本上是这样的形式,并注意"捕获":

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

因此,当您查看它时,您会看到"near"选项,它应该是不言自明的,以及当然在"2d"和"2dsphere"索引之间划分的"spherical"。如前所述,这里还需要"distanceField",并且将是文档中写入计算距离的路径。但还有一个更重要的选择。

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

因此,由于想法是相反的情况,那么您应该瞄准一个大于集合中文档总数的数字。这将允许管道阶段检查整个集合,从而计算每个文档的距离。然后当然,只需$sort做这件事,并以"最远"的顺序返回文件。


这是最佳的吗?当然不是,这是正确的,因为你只是问与"近"这个词的意思完全相反。如果有一个"内置"$far$geoFar运算符,那么我们可以期待不同的。

但这就是过程。也许如果你似乎即将到来的"让我离这里越远!"应用程序真的在世界上引起了轰动,那么也许我们都会和你一起思考这些思路。

最新更新