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
相关产品推荐
相关产品推荐

