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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:45:05