You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:42:20