Mongoose中.sort()排序时报错:比较函数参数不符合要求
问题解决:Mongoose .sort() 报错 "The comparison function must be either a function or undefined"
你的代码存在两个关键问题导致了该报错:
- 提前执行查询破坏链式调用:第一行的
await Tour.find(queryStr)会直接执行数据库查询并返回文档数组,而非Mongoose的Query对象。数组的sort()方法要求传入比较函数,你传入字符串自然触发错误。 - 变量名拼写错误:你定义了排序规则变量
sortBy,但调用sort()时误用了未定义的sort变量(该错误被第一个问题覆盖)。
修复后的代码:
// 不要提前await,保留Query对象用于链式调用 let query = Tour.find(queryStr); if (req.query.sort) { const sortBy = req.query.sort.split(',').join(' '); // 使用正确的变量名sortBy传入排序规则 query = query.sort(sortBy); } // 最后执行查询并获取结果 const tours = await query;
关键说明
Mongoose查询采用链式构建模式:只有调用await或exec()时才会真正执行数据库请求。因此需要先保留Query对象,依次添加sort()等查询修饰条件,最后再执行查询。
另外,split(',').join(' ')的作用是将请求参数中逗号分隔的多字段排序规则(比如price,-rating)转换为Mongoose支持的空格分隔格式,实现多字段排序(负号表示降序)。
内容的提问来源于stack exchange,提问作者Michael_O
相关产品推荐
相关产品推荐

