MongoDB与位置标准分页

时间:2014-07-11 06:12:13

标签: mongodb pagination mongodb-query aggregation-framework geospatial

我希望按字段排序数据。例如

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中使用分区标准吗?

1 个答案:

答案 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。不是没有更多的努力来完成这项工作。