javascript - mongodb按范围查询分页与另一个排序字段

标签 javascript node.js mongodb mongoose mongodb-query

这是我的架构的简化版本:

var MySchema = new Schema({
    createdDate: {
        type: Date,
        required: true,
        default: Date.now,
        index: true
    },
    vote: {
        type: Number,
        index: true,
        default: 0
    }
});

我有大量数据,因此为了获得良好性能的分页,我使用范围查询,如:.find({_id: {$gt: lastId}}).limit(20)。现在我还想按投票字段对我的数据进行排序。我应该怎么做?

最佳答案

与寻找更大值(value)的概念几乎相同,但这次是在“投票”上,但有另一个转折:

var query = Model.find({ 
    "vote": { "$lte": lastVoteValue  }, 
    "_id": { "$nin": seenIds }
}).sort({ "vote": -1 }).limit(20);

因此,如果您考虑一下这里发生的事情,因为您正在进行“降序”排序,您希望投票值“小于或等于”从上一页看到的最后一个值。

第二部分将是以前看到的 _id 值的“列表”,这些值可能来自最后一页,也可能更多。这部分取决于您的“投票”值的“粒度”程度,以确保在下一页中不会看到任何已分页的项目。

所以 $nin运算符在这里进行排除。您可能想要跟踪“投票”值如何变化,以帮助您决定何时减少“seenIds”列表。

这就是进行分页范围查询的方法,但是如果你需要按数字跳转到“特定”页面,请不要忘记你仍然需要 .limit().skip()。但这将适用于单页跳转,或者只是增量分页。

关于javascript - mongodb按范围查询分页与另一个排序字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25093012/

相关文章:

javascript - AngularJS html5mode重新加载页面

php 里面的 javascript 复选框值

mongodb - 不可达/健康的副本集

node.js - Mongoose:未保存的对象数组

javascript - MongoDB 获取最后一个元素不能与 node.js 一起正常工作

javascript - 使用 jquery 获取表的每行总计和总计

javascript - 返回多行而不是 console.log

mysql - Nodejs HTML 选择列表

javascript - Hapijs 服务器启动错误-无效的服务器选项

javascript - 之后添加 Facebook 范围