NestJS中Schema数组内嵌对象未自动生成Mongo ObjectId问题求助
解决方案
问题原因
你当前的EmergencyContact类未被Mongoose识别为合法的内嵌子文档Schema,因此不会触发自动生成_id的默认逻辑:
EmergencyContact没有添加@Schema()装饰器,仅定义了普通属性- 主Schema中
emergencyContact字段的@Prop配置未明确指定子文档类型,Mongoose只会将其当作普通对象数组处理,不会对子对象做_id生成处理
修复步骤
1. 给内嵌对象类添加@Schema装饰器
修改EmergencyContact的定义,添加@Schema()装饰器将其标记为Mongoose子文档Schema:
// 注意导入@Schema装饰器 import { Prop, Schema } from '@nestjs/mongoose'; import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty } from 'class-validator'; @Schema() // 新增这行,标记为子文档Schema export class EmergencyContact { // 这里不需要单独加@Prop({_id: true}),子文档默认会自动生成_id _id: string; @Prop() @ApiProperty() @IsNotEmpty() title: string; @Prop() @ApiProperty() @IsNotEmpty() contactNumber: string; @Prop() status: boolean; }
2. 修改主Schema的数组字段配置
调整EDiary类中emergencyContact字段的@Prop配置,明确指定数组元素类型为EmergencyContact:
import { Prop, Schema } from '@nestjs/mongoose'; import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty } from 'class-validator'; import { Type } from 'class-transformer'; import { EmergencyContact } from './emergency-contact.dto'; // 导入对应的类 @Schema({ timestamps: true }) export class EDiary { _id: string; @Prop() @ApiProperty() @IsNotEmpty() state: string; @ApiProperty() // 修改@Prop配置,明确指定数组类型为EmergencyContact @Prop({ type: [EmergencyContact] }) @Type(() => EmergencyContact) emergencyContact: EmergencyContact[]; }
验证效果
修改完成后重启服务,新增EDiary文档时,emergencyContact数组内的每个对象都会自动生成MongoDB ObjectId格式的_id字段,无需手动赋值。
内容的提问来源于stack exchange,提问作者Shailesh Bhokare
相关产品推荐
相关产品推荐

