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

Node.js MongoDB分页问题:skip跳过文档功能异常

问题分析与修复

你的分页功能出现异常,主要有两个原因:

  • pageSize未转换为数字:req.query获取的参数默认是字符串类型,直接参与计算或传入limit()可能引发隐式转换问题,导致skipDoc计算错误。
  • 排序稳定性不足:仅按created_at排序时,若多个文档的created_at值相同,MongoDB的返回顺序会不稳定,进而导致分页时出现文档重复或遗漏。
修复后的代码
export const getSchemesList = expressAsyncHandler(async (req, res) => {
    try {
        const { pageSize, pageNumber, status } = req.query;

        // 转换为数字并设置默认值,避免字符串类型问题
        const page = Number(pageNumber) || 1;
        const size = Number(pageSize) || 10; // 设默认页大小为10,可根据需求调整
        // 增加_id作为次级排序字段,保证排序稳定性
        const sort = { created_at: -1, _id: -1 };
        let query = {};

        if (status) {
            query.status = status;
        }

        const count = await Scheme.countDocuments(query);
        const skipDoc = size * (page - 1);
        const pages = Math.ceil(count / size);

        // 统一查询逻辑,无需分status判断
        const schemes = await Scheme.find(query)
            .sort(sort)
            .limit(size)
            .skip(skipDoc);

        res.json({ schemes, page, pages });
    } catch (error) {
        res.status(500);
        throw new Error("Internal Server Error");
    }
});
关键修改说明
  1. 类型转换与默认值:将pageSize转换为数字类型并设置默认值,确保skipDoc计算和limit()参数的正确性。
  2. 稳定排序:在排序规则中加入_id: -1,利用MongoDB文档_id的唯一性,保证即使created_at重复,返回顺序也始终一致。
  3. 简化查询逻辑:合并了status存在与否的查询代码,减少冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:36:05