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

NestJS中使用Mongoose+TypeScript为何能自动将_id转换为id?

原因分析

  • Mongoose 内置虚拟id属性
    Mongoose 所有查询返回的文档实例,默认会挂载一个虚拟属性id,本质是对MongoDB原生_id字段调用toString()方法的返回值,不需要你在Schema或者自定义接口里手动定义,也不会持久化存储到MongoDB中,只是运行时可访问的getter属性,所以访问时不会报运行时错误。
  • TypeScript 类型未报错的原因
    你注入的productModel类型是Model<Product>,Mongoose的Model类型执行查询后返回的是Mongoose Document实例,这个实例的类型本身就继承了Mongoose内置的Document接口,该接口已经预先声明了id、_id等通用字段的类型,所以即使你自定义的Product接口没有写id属性,TypeScript也不会抛出类型错误。

扩展说明

如果你不需要这个默认的虚拟id属性,可以在定义Schema的时候手动关闭:

export const ProductSchema = new mg.Schema(
  {
    title: { type : String, required: true}, 
    description: { type : String, required: true}, 
    price: { type: Number, required: true} 
  },
  { id: false } // 关闭默认id虚拟属性
)

关闭之后再访问product.id就会抛出未定义的错误,只能通过product._id访问MongoDB原生的主键。

内容的提问来源于stack exchange,提问作者EyeQ Tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:15:06