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

Typegoose如何为Ref引用类型子文档数组新增自定义字段?

如何在Typegoose定义的User类引用数组中新增额外字段

你当前的写法是直接在User类中定义Ref<Car>[]类型的cars字段,这种模式下数组项只会存储关联Car文档的_id,无法直接添加自定义字段。要实现给关联项增加status属性的需求,只需要单独定义关联子文档类承载关联关系和自定义属性即可,具体实现如下:

实现代码

原有Car类不需要做任何修改——status是用户和车辆关联维度的属性,不属于车辆本身的固有属性,不应该定义在Car类中。

import { prop, Ref, getModelForClass } from '@typegoose/typegoose';

class Car {
  @prop()
  public model?: string;
}

// 定义用户与车辆的关联子文档,存储关联关系+用户维度的自定义属性
class UserCarRelation {
  // 存储对Car集合的引用
  @prop({ ref: () => Car, required: true })
  public car!: Ref<Car>;

  // 新增需要的status字段,可按需求设置默认值、校验规则
  @prop({ required: true, default: false })
  public status!: boolean;
}

class User {
  @prop()
  public name?: string;

  @prop({ required: true })
  public age!: number; 

  // 替换原有的Ref<Car>[]配置,改为关联子文档数组
  @prop({ type: () => [UserCarRelation] })
  public cars?: UserCarRelation[]; 
}

export const UserModel = getModelForClass(User);
export const CarModel = getModelForClass(Car);

使用说明

  • 写入数据时直接按子文档结构传值即可,生成的存储结构和你预期的目标结构完全匹配:
await UserModel.create({
  name: "Jonh Doe",
  age: 25,
  cars: [
    { car: "1", status: false },
    { car: "2", status: true }
  ]
})

存储后的User文档结构:

{
  "_id": "1",
  "name": "Jonh Doe",
  "age": 25,
  "cars": [
    { "_id": "子文档自动生成id", "car": "1", "status": false },
    { "_id": "子文档自动生成id", "car": "2", "status": true }
  ]
}

注:如果不需要子文档自动生成的_id字段,可以在@prop配置中给UserCarRelation加_id: false选项关闭。

  • 查询时如果需要填充Car的完整信息,指定populate路径为cars.car即可:
const user = await UserModel.findById("1").populate("cars.car");
  • 如果是存量老数据迁移,写一次性脚本遍历原有User文档,把原cars数组里仅存_id的项转换为{ car: 原_id值, status: 默认值 }的结构即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39