Mongoose升级6.4后报TypeError: .select is not a function如何解决
问题原因
该报错是Mongoose 6.x版本的破坏性变更与原有不规范写法共同导致的:
- Mongoose 5.x存在历史遗留行为:
await Model.find()返回的是特殊封装的Mongoose文档数组,对象上挂载了Query原型的所有方法,即使已经触发过一次查询执行,依然可以在返回值上调用select()、lean()等链式方法,这些方法会触发查询重新执行,因此不会抛出错误。 - Mongoose 6.x移除了这个不符合预期的行为:
await Model.find()直接返回标准JavaScript数组(开启lean时返回普通对象数组),标准数组的原型上不存在select()、lean()这类Mongoose Query实例方法,调用时自然会抛出TypeError: query.select is not a function错误。
修复方案
调整代码执行顺序,遵循Mongoose标准查询编写逻辑:先完成所有查询配置的链式调用,最后通过await触发查询执行、拿到返回结果,不要在find()调用前直接加await。
修改后代码示例:
// 先获取Query实例,不提前执行查询 const query = db.DATABASENAME.find(JSON.parse(queryStr)); // 链式调用所有查询配置方法 query.select("-meeting -__v").lean(); // 最后await执行查询,拿到最终结果 const res = await query;
也可以写成连贯的链式形式,跨版本兼容性更好:
const res = await db.DATABASENAME.find(JSON.parse(queryStr)) .select("-meeting -__v") .lean();
上述写法在Mongoose 5.x和6.x版本下均可正常运行,符合官方最佳实践。
内容的提问来源于stack exchange,提问作者Yishu Vohra
相关产品推荐
相关产品推荐

