Mongoose创建文档时自动向数组添加计算子文档的最优方法
实现方案
完全可以在Schema层完成该逻辑,无需修改业务层代码,你可以使用Mongoose的pre('save')中间件实现自动注入创建者成员信息。
注意:你提供的
memberInfoSchema中idMember的必填属性拼写有误,requied应改为required,避免后续校验报错。
具体代码实现
在boardSchema定义完成后添加如下中间件逻辑即可:
boardSchema.pre('save', function(next) { // 仅在新建文档时执行该逻辑,避免更新操作重复添加 if (this.isNew) { this.members.push({ idMember: this.idMemberCreator, memberType: 'owner' }) } next() })
逻辑说明
- 钩子触发时机为文档写入数据库前,仅对新创建的board文档生效
- 自动读取当前文档的
idMemberCreator值作为子文档的idMember字段值 - 显式指定成员类型为
owner,覆盖memberInfo默认的normal取值
兼容批量创建场景
如果你业务中会用到insertMany批量创建board文档,默认的pre('save')钩子不会触发,可以额外添加insertMany钩子适配:
boardSchema.pre('insertMany', function(next, docs) { docs.forEach(doc => { doc.members.push({ idMember: doc.idMemberCreator, memberType: 'owner' }) }) next() })
内容的提问来源于stack exchange,提问作者mrhaffner
相关产品推荐
相关产品推荐

