聚合框架有一种方法可以使用$geoNear管道阶段。基本上,它将“投影”一个“距离”字段,然后您可以在组合排序中使用该字段:
db.collection.aggregate([
{ "$geoNear": {
"near": [12,32],
"distanceField": "distance",
"maxDistance": 10
}},
{ "$sort": { "distance": 1, "rating" -1 } }
{ "$skip": 0 },
{ "$limit": 25 }
])
应该没问题,但是“跳过”和“限制”对于大的跳过来说并不是真正有效。如果您不需要“页码编号”就可以离开并且只想继续前进,那么请尝试不同的技术。
基本原则是跟踪为页面找到的最后一个距离值以及_id
该页面或前几个页面的文档值,然后可以使用$nin操作员:
db.collection.aggregate([
{ "$geoNear": {
"near": [12,32],
"distanceField": "distance",
"maxDistance": 10,
"minDistance": lastSeenDistanceValue,
"query": {
"_id": { "$nin": seenIds },
"rating": { "$lte": lastSeenRatingValue }
},
"num": 25
}},
{ "$sort": { "distance": 1, "rating": -1 }
])
从本质上讲,这会好得多,但它不会帮助您跳转到例如“第 25 页”。并非没有更多的努力来解决这个问题。