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

求助:为Node.js中MongoDB聚合查询函数添加含Limit与Page的分页

为MongoDB聚合查询添加分页功能

要给你的聚合查询加上分页功能,核心是利用MongoDB的$skip和$limit聚合阶段,步骤如下:

  1. 获取并处理分页参数:从req.query中提取page(页码)和limit(每页条数),设置合理默认值并转为数字类型
  2. 计算跳过的文档数:根据页码和每页条数计算需要跳过的记录数
  3. 在聚合管道中添加分页阶段:将$skip和$limit放在聚合管道的最后(确保关联查询完成后再分页)

修改后的代码(基础分页版)

function getDigitalMigrationJoin(req, res, next) {
    // 从请求参数获取分页参数,设置默认值
    const page = parseInt(req.query.page) || 1;
    const limit = parseInt(req.query.limit) || 10;
    // 计算需要跳过的文档数量
    const skip = (page - 1) * limit;

    DigitalMigrationForm.aggregate([
        // 关联集合的lookup阶段
        {
            $lookup: {
                from: DigitalMigrationFormList.collection.name,
                localField: "_id",
                foreignField: "digitalFormId",
                as: "forms"
            }
        },
        // 分页阶段:先跳过指定数量的文档,再限制返回条数
        { $skip: skip },
        { $limit: limit }
    ]).exec(function (err, results) {
        if (err) {
            return next(err); // 把错误传递给错误处理中间件
        }
        console.log(results);
        res.send(results);
    });
}

进阶版:返回总条数(方便前端计算总页数)

如果需要给前端返回总记录数,方便做分页导航,可以用$facet聚合阶段同时获取分页数据和总计数:

function getDigitalMigrationJoin(req, res, next) {
    const page = parseInt(req.query.page) || 1;
    const limit = parseInt(req.query.limit) || 10;
    const skip = (page - 1) * limit;

    DigitalMigrationForm.aggregate([
        {
            $lookup: {
                from: DigitalMigrationFormList.collection.name,
                localField: "_id",
                foreignField: "digitalFormId",
                as: "forms"
            }
        },
        // 使用$facet同时获取分页数据和总条数
        {
            $facet: {
                data: [{ $skip: skip }, { $limit: limit }],
                totalCount: [{ $count: "total" }]
            }
        }
    ]).exec(function (err, results) {
        if (err) {
            return next(err);
        }
        // 整理返回格式,把总条数提取出来
        const response = {
            data: results[0].data,
            total: results[0].totalCount[0]?.total || 0,
            page: page,
            limit: limit
        };
        console.log(response);
        res.send(response);
    });
}

注意事项

  • 确保page和limit参数是数字类型,避免出现NaN导致的错误
  • 如果page传入0或者负数,建议做额外的参数校验,比如强制设置为1
  • $skip和$limit的顺序不能颠倒,必须先跳过再限制条数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:01:21