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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:55:33