如何在Mongoose的exec()方法之后执行sort等函数?
在Mongoose中处理exec()后的排序等操作
首先要明确:Mongoose的查询方法(比如sort()、populate())是用来构建查询语句的,需要在调用exec()之前链式调用,由MongoDB端执行这些操作,效率更高。如果已经调用了exec(),此时你拿到的是查询返回的JavaScript文档数组,只能用数组的原生方法做后续处理。
推荐做法:exec()前链式调用查询方法
把sort()、populate()等操作放在exec()之前,让MongoDB直接返回排序好的结果:
// 构建完整查询链后执行 Model.find({}) .populate('targetField') // 填充指定字段 .sort({ createdAt: -1 }) // 按createdAt降序排序 .exec() .then(sortedDocs => { // 直接拿到排序后的文档数组 console.log(sortedDocs); }) .catch(err => { console.error('查询失败:', err); });
特殊场景:exec()后再处理(数组排序)
如果必须在拿到查询结果后再做排序(比如需要先对数据做自定义处理),可以用JavaScript数组的sort()方法:
Model.find({}) .populate('targetField') .exec() .then(docs => { // 对返回的文档数组做自定义排序,比如按名称升序 const sortedDocs = docs.sort((docA, docB) => { return docA.name.localeCompare(docB.name); }); console.log(sortedDocs); }) .catch(err => { console.error('查询失败:', err); });
用async/await更直观
如果习惯异步函数写法:
async function getProcessedDocs() { try { // 先执行查询并填充 const docs = await Model.find({}).populate('targetField').exec(); // 后续处理:排序或其他操作 const sortedDocs = docs.sort((a, b) => b.updatedAt - a.updatedAt); return sortedDocs; } catch (err) { console.error('处理失败:', err); } }
注意:除非有特殊业务需求,否则优先选择在exec()前调用Mongoose的查询方法,因为MongoDB端处理排序/筛选的效率远高于在内存中处理大数据量数组。
内容的提问来源于stack exchange,提问作者Sanay Varghese
相关产品推荐
相关产品推荐

