Mongoose数组中子Schema如何从父Schema计算默认值?
解决Mongoose子文档默认值无法访问父文档字段的问题
问题原因
Mongoose子文档的默认值函数执行时,this.parent尚未完全关联到父文档实例,无法正确获取父文档的a和b字段值,导致d的默认值计算失败,触发必填字段校验报错。
可行解决方案
方案一:使用父文档预保存中间件
在父文档Schema上添加pre('save')钩子,在保存前遍历子文档数组,统一计算d的值:
const childSchema = new Schema({ c: Number, d: { type: Number, required: true } }); const parentSchema = new Schema({ a: Number, b: Number, records: [childSchema] }); parentSchema.pre('save', function(next) { // 先校验父文档的a、b是否存在(按需调整) if (this.a == null || this.b == null) { return next(new Error('a和b为必填字段')); } // 遍历子文档,计算未设置的d值 this.records.forEach(record => { if (!record.d && record.c != null) { record.d = this.a + this.b + record.c; } }); next(); });
方案二:创建实例时手动计算
在构建父文档数据阶段,提前为每个子文档计算d的值:
// 准备父文档数据 const parentData = { a: 1, b: 2, records: [ { c: 3 }, { c: 4 } ] }; // 遍历records计算d parentData.records.forEach(record => { record.d = parentData.a + parentData.b + record.c; }); // 创建并保存实例 const ParentModel = mongoose.model('Parent', parentSchema); const parent = new ParentModel(parentData); parent.save() .then(doc => console.log(doc)) .catch(err => console.error(err));
为什么原方案失效
Mongoose子文档的默认值函数执行时机早于父子文档关联完成的时机,此时this.parent无法正确指向完整的父文档实例,导致this.parent.a和this.parent.b获取失败,最终d因无有效默认值触发必填校验错误。
内容的提问来源于stack exchange,提问作者tubular
相关产品推荐
相关产品推荐

