Mongoose嵌套子Schema内autopopulate配置virtual字段不生效问题
问题原因
你没有给嵌套的子Schema单独注册mongoose-autopopulate插件。
mongoose的插件注册逻辑不会从父Schema向下传递给嵌套的子文档Schema:你第二个可正常运行的示例里,直接给独立Schema注册了插件,所以虚拟字段的自动填充逻辑能正常触发;但嵌套场景下你仅给父SchemaparentList挂载了插件,子Schemachild本身没有注册插件,它上面定义的带autopopulate: true配置的虚拟字段就不会被插件识别处理,自然不会自动填充关联的user对象。
修复方法
在定义完子Schema的虚拟字段后、将子Schema嵌入父Schema之前,单独给子Schema注册autopopulate插件即可,修正后的代码如下:
"use strict"; const mongoose = require('mongoose'), Schema = mongoose.Schema, autopopulate = require('mongoose-autopopulate'); const child = new Schema({ userUuid: { type: String, required: true }, timeStamp: { type: Date, default: new Date() } }, {toJSON: {virtuals: true}}); child.virtual('user', { ref: 'users', localField: 'userUuid', foreignField: 'uuid', autopopulate: true }); // 关键配置:给子Schema单独注册autopopulate插件 child.plugin(autopopulate); const parentList= new Schema({ // 其他业务属性 children: [child] }); parentList.plugin(autopopulate); module.exports = parentList;
注意事项
- 不管子Schema嵌套多少层,只要子Schema里定义了需要自动填充的虚拟字段,就必须给对应层级的子Schema单独注册
autopopulate插件,父级插件不会向下继承生效。 - 注意插件注册顺序:必须先完成子Schema的虚拟字段定义、插件注册,再将子Schema作为字段类型传入父Schema的结构定义中,顺序颠倒也会导致自动填充失效。
内容的提问来源于stack exchange,提问作者Hodaya Shalom
相关产品推荐
相关产品推荐

