发布于 2016-02-23 10:39:35
当然,有一种方法可以首先返回最远的元素,那就是在聚合框架中使用$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"选项时,它应该是不言自明的,也是"spherical",它当然是在"2d“和"2dsphere”索引之间划分的。正如前面提到的,这里需要的是"distanceField",它将是写入计算距离的文档中的路径。但是还有一个重要的选项。
如前所述,总的意图是最近的,因此,大多数这种性质的查询最好只返回一个子集合的数据,这些数据确实“最近”到被查询的点。这意味着要返回文档上的"limit"。看一看文档,就会发现典型的“默认”100。
因此,由于这个想法是相反的情况,那么您应该针对的是一个比集合中的文档总数更大的。这将允许由管道阶段检查整个集合,从而为每个文档计算出一个距离。当然,它只是去$sort做它的事情,并以“最远”的顺序返回文档。
这是最优的吗?当然不是,既然你只是问“近”这个词的意思正好相反,这是正确的。如果有一个“内置”的$far或$geoFar运算符,那么我们可以期待不同的。
但这就是过程。也许你即将到来的“让我离这里越远越好!”应用程序确实在世界上引起轰动,那么也许我们都会和你一起思考这些问题。
https://stackoverflow.com/questions/35572755
复制相似问题