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

如何基于MongoDB实现Express API的分页式文档获取?

在MongoDB中实现分批分页获取文档

要实现按请求参数分批返回文档,核心是利用MongoDB的分页能力,以下提供两种实用方案:

一、传统分页方案(skip + limit)

适合数据量不大的场景,逻辑简单直接:

  • 从请求参数中获取页码arg,计算需要跳过的文档数量:skipCount = (arg - 1) * 每页条数(这里每页固定10条)
  • 结合sort()指定排序规则(_id默认包含时间戳,升序{_id:1}是旧文档在前,降序{_id:-1}是新文档在前)
  • 用skip(skipCount)跳过前面的文档,再用limit(10)限制返回数量

Express API示例代码:

// 假设已完成MongoDB的collection连接初始化
app.get('/api/docs', async (req, res) => {
  try {
    const arg = parseInt(req.query.arg);
    const pageSize = 10;
    if (isNaN(arg) || arg < 1) {
      return res.status(400).json({ error: 'arg必须是大于等于1的整数' });
    }
    const skipCount = (arg - 1) * pageSize;
    // 若要获取最新文档,使用{_id: -1}降序;要获取最早文档则用{_id:1}升序
    const docs = await collection.find({})
      .sort({ _id: -1 })
      .skip(skipCount)
      .limit(pageSize)
      .toArray();
    res.json(docs);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

注意:skip()在数据量较大时性能会下降,因为MongoDB需要先扫描并跳过前面所有文档,此时更推荐下面的高效分页方案。

二、高效分页方案(基于文档ID游标)

通过上一页最后一条文档的_id定位下一页起始位置,避免skip()的性能损耗,适合大数据量场景:

  • 首次请求无需额外参数,直接返回前10条文档,同时返回这一页最后一条的_id
  • 后续请求带上该_id,通过_id的比较条件过滤出下一批文档

Express API示例代码:

app.get('/api/docs', async (req, res) => {
  try {
    const pageSize = 10;
    const lastId = req.query.lastId;
    let query = {};
    // 按降序获取最新文档时,用$lt匹配比lastId更早的文档;升序则用$gt
    if (lastId) {
      query._id = { $lt: new ObjectId(lastId) };
    }
    const docs = await collection.find(query)
      .sort({ _id: -1 })
      .limit(pageSize)
      .toArray();
    // 返回文档的同时,携带当前页最后一条的ID供下一页请求使用
    res.json({
      data: docs,
      lastId: docs.length > 0 ? docs[docs.length - 1]._id.toString() : null
    });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

关于你当前的代码

你现有的collection.find({}).sort({_id:1}).limit(10).toArray()是按_id升序获取最早的10条文档,如果要获取最新的10条,只需将排序规则改为sort({_id:-1})即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:13:10