我希望按字段排序数据。例如
db.Users.find().limit(200).sort({'rating': -1}).skip(0)
这是工作,我得到排序数据。并且可以使用分页。
但是,如果添加条件.find({'location':{$near : [12,32], $maxDistance: 10}})
排序无效。
完整查询:
db.Users.find({'location':{$near : [12,32], $maxDistance: 10}}).limit(200).sort({'rating': -1}).skip(0)
例如
没有标准位置:
偏移0
rating 100
rating 99
rating 98
rating 97
rating 96
抵消5
rating 95
rating 94
rating 93
rating 92
rating 91
抵消10
rating 90
rating 89
rating 88
rating 87
rating 86
使用条件位置
偏移0
rating 100
rating 99
rating 98
rating 97
rating 96
抵消5
rating 90
rating 89
rating 88
rating 87
rating 86
抵消10
rating 95
rating 94
rating 93
rating 92
rating 91
可能是什么问题?我可以在MongoDB中使用分区标准吗?
答案 0 :(得分:1)
聚合框架有一种方法可以使用$geoNear
管道阶段来完成此任务。基本上它会"项目" a"距离"然后,您可以在组合排序中使用该字段:
db.collection.aggregate([
{ "$geoNear": {
"near": [12,32],
"distanceField": "distance",
"maxDistance": 10
}},
{ "$sort": { "distance": 1, "rating" -1 } }
{ "$skip": 0 },
{ "$limit": 25 }
])
应该没问题,但是"跳过"和"限制"对于大型跳过而言,效率并不高。如果你可以离开而不需要"页码编号"并且只想前进,然后尝试不同的技术。
基本原则是跟踪找到的页面的最后一个距离值以及该页面或之前几个文档的_id
值,然后可以使用{{3运营商:
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 }
])
基本上这会更好,但它不会帮助你跳到" page"例如25。不是没有更多的努力来完成这项工作。