Mongoose查询sort排序功能不生效问题求助
问题原因
- 核心错误是你在调用
Plot.find()的时候提前加了await关键字:- 不加
await时Plot.find()返回的是Mongoose Query实例,内置sort()、limit()等链式调用方法,可以后续拼接查询逻辑 - 你加了
await之后,query变量直接被赋值为查询返回的文档数组,原生JS数组没有Mongoose的sort()方法,调用就会抛出异常,这就是你报错的根本原因
- 不加
- 后续你再次对已经是数组的
query执行await也属于多余操作,不会返回预期结果
解决方案
把Plot.find()前的await去掉,等所有链式查询逻辑(排序、分页、字段筛选等)拼接完成后,再统一执行await获取最终结果。
修正后代码
exports.getAllFamilyPlots = async (req, res) => { try { //BUILD QUERY const queryObj = { ...req.query }; const excludedFields = ['page', 'sort', 'limit', 'fields']; excludedFields.forEach((el) => delete queryObj[el]); let queryStr = JSON.stringify(queryObj); queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `$${match}`); // 移除此处的await,保留Mongoose Query实例用于后续链式调用 let query = Plot.find(JSON.parse(queryStr)); //SORTING if (req.query.sort) { query = query.sort(req.query.sort); // 如需倒序排序,请求参数传入sort=-size即可 } // 所有查询逻辑拼接完成后,统一await执行得到最终结果 const plots = await query; res.status(200).json({ status: 'success', results: plots.length, data: { plots, }, }); } catch (err) { res.status(404).json({ status: 'fail', message: err, }); } };
内容的提问来源于stack exchange,提问作者Hanama Namana
相关产品推荐
相关产品推荐

