Mongoose/MongoDB双字段排序分页:从指定起始点查询无结果问题
双字段降序分页查询失效问题解决
问题根因
你当前使用的$match筛选逻辑为rating <= 上次返回最后一条的rating 且 _id < 上次返回最后一条的_id,该逻辑存在明显漏洞:MongoDB中不同rating的记录没有_id大小的关联约束,大量rating < lastRating但_id > lastID的合法下页数据会被AND逻辑直接过滤,最终导致无结果返回。
解决方法
将筛选条件改为$or组合的两段逻辑,匹配所有排序规则下位于上一页最后一条之后的记录:
{ $match: { $or: [ // 场景1:评分严格小于上一页最后一条的评分 { rating: { $lt: lastRating } }, // 场景2:评分和上一页最后一条相等,且_id严格小于上一页最后一条的_id { rating: { $eq: lastRating }, _id: { $lt: lastID } } ] } }
配套注意事项
- 保留原有排序规则
$sort: { rating: -1, _id: -1 }和$limit条数限制,和筛选条件配合使用 - 首次拉取数据不需要添加
$match筛选,直接执行排序+条数限制即可 - 建议创建联合索引
db.collection.createIndex({ rating: -1, _id: -1 }),可大幅降低分页查询的性能开销
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

