Mongoose 5与6版本model函数差异及Schema兼容问题咨询
问题:Mongoose 6.x 中 NestJS 定义的 BookSchema 报错问题
问题场景
以下代码在 Mongoose 5.0.2 + @nestjs/mongoose 9.2.1 环境下可正常运行,但升级到 Mongoose 6.0.2 后,BookSchema 出现报错:
import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose"; import { Document, Schema as MongooseSchema, model } from "mongoose"; export type BookDocument = Book & Document; @Schema() export class Book { _id: MongooseSchema.Types.ObjectId; @Prop({ required: true, unique: true }) name: string; } export const BookSchema = SchemaFactory.createForClass(Book); export const BookModel = model<BookDocument>("Book", BookSchema);
版本变更背后的原因
Mongoose 6.x 对 Schema 字段定义的校验逻辑做了严格升级:
- Mongoose 默认会自动为每个文档生成
_id字段,5.x 版本中允许手动重复声明该字段而不报错; - 6.x 版本加强了字段冲突检测,不允许开发者重复定义内置的
_id字段,否则会触发字段重复定义的错误。
修复方案
移除类中手动声明的 _id 字段即可,NestJS 的 SchemaFactory 会自动生成对应的 _id 类型和 Schema 定义。修改后的代码如下:
import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose"; import { Document, model } from "mongoose"; export type BookDocument = Book & Document; @Schema() export class Book { @Prop({ required: true, unique: true }) name: string; } export const BookSchema = SchemaFactory.createForClass(Book); export const BookModel = model<BookDocument>("Book", BookSchema);
内容的提问来源于stack exchange,提问作者user11931176
相关产品推荐
相关产品推荐

