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

如何使用Mongoose通过查询字符串实现数据检索(适配mongoose-paginate分页场景)

解决方案

现有代码问题

  • 逻辑顺序错误:当前代码先执行无筛选条件的分页查询,只有分页查询返回空假值才会执行学号查询,而mongoose-paginate无论是否查到数据都会返回标准分页结构,永远走不到学号查询分支
  • 参数冗余:mongoose-paginate会根据传入的page和limit自动计算偏移量skip,不需要手动计算
  • 参数解析错误:parseInt(req.query.limit, 4)的基数参数误写为4,会导致limit解析异常
  • 查询条件未传递:分页方法第一个参数就是筛选条件位,当前传空对象{}导致无法触发条件筛选

修正后实现代码

router.get('/allStudents', async (req,res) => {
  // 修正基数参数为10,默认分页大小可根据需求调整
  const limit = parseInt(req.query.limit, 10) || 10;
  const page = parseInt(req.query.page, 10) || 1;

  try {
    // 动态构建查询条件
    const query = {};
    // 请求携带stdID参数时加入查询条件
    if(req.query.stdID) {
      // 注意:如果stdID在Schema中定义为数字类型,需先转格式:query.stdID = Number(req.query.stdID)
      query.stdID = req.query.stdID;
    }

    // 直接将查询条件传入paginate第一个参数,同时保留分页能力
    const students = await Student.paginate(query, { limit, page });

    return res.status(200).json({
      success: true,
      data: students
    })

  } catch (err) {
    console.log(err);
    return res.status(500).json({
      success: false,
      msg: '查询失败'
    })
  }
});

拓展说明

如果需要支持多字段混合搜索,比如同时支持学号精确匹配、姓名模糊匹配,可扩展查询条件构建逻辑:

if(req.query.stdID) query.stdID = req.query.stdID;
// 模糊匹配姓名,$options:'i'代表不区分大小写
if(req.query.name) query.name = { $regex: req.query.name, $options: 'i' };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:15:03