Mongoose v5中Model.find().sort()返回空数组的问题求助
问题排查与解决
结合你提供的代码和使用的mongoose v5、Node.js v18环境,针对sort方法导致返回空数组的问题,可按以下方向排查:
1. 核对排序字段的正确性
先确认Tour模型中确实存在ratings字段,字段名拼写必须完全一致(比如不能写成rating)。mongoose v5在遇到不存在的排序字段时不会抛出错误,但可能导致查询结果异常。
可以打印req.query.sort的值确认是'ratings',再检查模型定义:
// 检查Tour模型的字段定义 const TourSchema = new mongoose.Schema({ // 其他字段... ratings: { type: Number, default: 0 } // 确认该字段存在且拼写正确 });
2. 转换排序参数格式
mongoose v5的sort()方法支持字符串格式,但部分场景下字符串解析可能出现问题。可以将排序字符串转为对象格式,避免潜在的解析异常:
if (req.query.sort) { const sortObj = {}; // 处理升序/降序,'-ratings'对应降序 if (req.query.sort.startsWith('-')) { sortObj[req.query.sort.slice(1)] = -1; } else { sortObj[req.query.sort] = 1; } query = query.sort(sortObj); }
3. 排查查询条件与排序的冲突
先注释掉排序逻辑,确认Tour.find(JSON.parse(queryStr))能正常返回数据。如果注释后数据正常,说明排序逻辑和queryStr解析出的查询条件存在冲突。
可以先打印解析后的查询条件,确认其有效性:
const parsedQuery = JSON.parse(queryStr); console.log('当前查询条件:', parsedQuery); let query = Tour.find(parsedQuery);
4. 版本兼容验证
Node.js v18和mongoose v5理论上兼容,但mongoose v5属于旧版本,可能存在隐性兼容问题。可以尝试:
- 升级mongoose到v5的最新补丁版本(如v5.13.20)
- 先查询原始数据确认存在,再执行排序排查问题:
// 先确认原始数据存在 const rawData = await Tour.find(JSON.parse(queryStr)); console.log('原始数据条数:', rawData.length); // 再执行带排序的查询 const tours = await Tour.find(JSON.parse(queryStr)).sort(req.query.sort);
内容的提问来源于stack exchange,提问作者Athulkal
相关产品推荐
相关产品推荐

