如何在Typegoose中填充嵌套文档?代码示例及问题求助
Typegoose嵌套关联文档填充问题解决
问题场景
定义了以下三个Typegoose Schema:
class User { @Prop() name: string } class Exam { @Prop() name: string @Prop({ ref: () => Exam }, PropType.ARRAY) examReq?: Ref<Exam>[] } class UserExam { @Prop({ ref: () => User }) userId: Ref<User> @Prop({ ref: () => Exam }) examId: Ref<Exam> }
执行查询时尝试填充所有嵌套关联:
userExamModel.find({ _id: id }).populate('examId').populate('examId.examReq')
发现examId已成功填充,但其中的examReq始终为空。
解决步骤
1. 修正Schema的字段定义错误
首先,Exam类中examReq的@Prop装饰器写法有误,Typegoose要求数组类型的配置需包含在同一个配置对象内,正确写法如下:
class Exam { @Prop() name: string @Prop({ ref: () => Exam, type: PropType.ARRAY }) examReq?: Ref<Exam>[] }
原代码将PropType.ARRAY作为第二个参数单独传递,会导致Typegoose无法正确识别该字段为引用类型数组,这是填充失败的潜在原因之一。
2. 使用嵌套Populate配置实现深层填充
Typegoose/Mongoose中,针对嵌套的关联(尤其是数组类型的引用),不能直接通过链式调用populate('路径.子路径')来实现深层填充,需要使用嵌套的populate配置明确指定填充层级:
正确的查询代码如下:
userExamModel.find({ _id: id }) .populate({ path: 'examId', populate: { path: 'examReq' // 若examReq内部还有更深层的关联,可继续嵌套populate配置 // populate: { path: '更深层路径' } } })
这种方式会先填充examId对应的Exam文档,再递归填充该Exam文档中examReq数组里的每个关联Exam文档,确保所有嵌套关联都被正确加载。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

