为什么Mongoose的Model.find()返回数组而非可链式调用的Query对象
问题根因
- Mongoose 中
Model.find()返回的Query属于thenable对象,支持Promise相关操作。当你在Exercise.find()前添加await关键字时,会直接触发查询执行并返回最终匹配的结果数组,而非原始的Query实例,因此无法调用limit等Query专属方法。
修复方案
将await的执行时机后置到所有查询条件、操作符拼接完成之后即可,修改后参考代码如下:
const Exercise = require('../models/exerciseModel'); const { getUserById } = require('./users'); const logUser = async (req, res) => { const { _id } = req.params let { from, to, limit } = req.query const user = await getUserById(_id) if(!user) return res.send("not found"); // 先构造Query实例,暂不执行查询 let exerciseQuery = Exercise.find({ username : user.username }) if(limit){ try{ // 建议指定十进制解析,避免异常 limit = parseInt(limit, 10) exerciseQuery = exerciseQuery.limit(limit) } catch(error){ console.log(error) } } // 所有查询逻辑拼接完成后,再await执行查询获取结果 const exercises = await exerciseQuery // 后续处理exercises的业务逻辑 }
提示:如果需要新增
from/to的日期范围过滤、排序等操作,都可以在Query执行前链式调用对应方法,全部逻辑拼接完成后再执行await即可。
内容的提问来源于stack exchange,提问作者yDesamours
相关产品推荐
相关产品推荐

