You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正Mongoose代码实现排序后数据的渐进式加载?

修正方案及优化建议

首先纠正一个误解:MongoDB的find执行逻辑是先过滤条件,再排序,最后执行skip和limit,并非你理解的先截取再排序。你的代码核心问题出在排序方向错误,以及不必要的id限制上。

最简修正代码

要实现start_date由近及远(倒序)加载,只需调整排序方向,同时移除多余的id条件(若你的渐进加载逻辑不依赖id):

const future_trainings = await Training.find(
  {
    ...filter,
    start_date: {$gte: cur_time} // 保留时间过滤条件
  },
  requested_training_data,
  {
    sort: {start_date: -1}, // 改为-1表示倒序,最近的日期优先返回
    skip: skip,
    limit: limit
  }
);

渐进加载的性能优化方案

若数据量较大,skip会随页数增加导致性能下降,此时推荐用基于日期的游标分页替代skip/limit,性能更稳定:

// 首次加载时last_start_date为null,后续分页时赋值为上一页结果的最后一条start_date
const query = {
  ...filter,
  start_date: {$gte: cur_time}
};

// 后续分页时,过滤掉已加载过的较新数据
if (last_start_date) {
  query.start_date = {$lt: last_start_date, $gte: cur_time};
}

const future_trainings = await Training.find(
  query,
  requested_training_data,
  {
    sort: {start_date: -1},
    limit: limit
  }
);

这种方式无需使用skip,直接通过日期条件过滤已加载数据,避免了大偏移量下的性能损耗。

关于你提出的两种方案的说明

  • 先全量获取再截取:仅适用于数据量极小的场景,数据量大时会占用大量内存,不推荐。
  • 先取id和start_date再用$in:比全量获取更优,但多了一次查询操作,效率不如直接调整排序和分页逻辑。

内容的提问来源于stack exchange,提问作者Can4k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:51:04