求助:为Node.js中MongoDB聚合查询函数添加含Limit与Page的分页
为MongoDB聚合查询添加分页功能
要给你的聚合查询加上分页功能,核心是利用MongoDB的$skip和$limit聚合阶段,步骤如下:
- 获取并处理分页参数:从
req.query中提取page(页码)和limit(每页条数),设置合理默认值并转为数字类型 - 计算跳过的文档数:根据页码和每页条数计算需要跳过的记录数
- 在聚合管道中添加分页阶段:将
$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
相关产品推荐
相关产品推荐

