Mongoose嵌套路径搭配refPath时多级populate失效如何解决?
解决方法
问题原因
你写的两种写法存在不同的问题:
- 第一种嵌套populate写法在低版本Mongoose中存在解析bug,无法自动识别子文档内的refPath配置,导致填充失效
- 第二种写法为同一
item路径指定了两个固定model,后执行的填充操作会把前一次填充的非对应类型数据覆盖为null,因此只能保留一种类型的填充结果
正确写法
写法1:直接指定完整嵌套路径(兼容性最好,推荐)
直接填写从父文档到待填充字段的完整路径,Mongoose会自动识别对应字段的refPath配置,根据每条子文档的itemType值自动匹配对应的模型填充:
const mQuery = Parent.find().populate('children.item');
写法2:嵌套populate写法(适合需要对子数组做额外查询配置的场景)
如果需要对children数组做过滤、字段筛选等额外配置,可以用嵌套写法,不需要手动指定model参数,Mongoose会自动读取refPath:
const mQuery = Parent.find().populate({ path: 'children', // 可额外添加match、select等配置处理children数组 populate: { path: 'item' } });
注意事项
- 必须确保
typeA、typeB两个模型已经通过mongoose.model('typeA', 对应Schema)完成注册,模型名称必须和itemType的枚举值完全一致,大小写敏感 - 如果使用嵌套populate写法仍然失效,建议升级Mongoose到5.11.0以上的稳定版本,低版本存在嵌套refPath解析的已知问题
- 不要为带refPath的字段手动指定固定
model参数,会覆盖refPath的自动匹配逻辑
内容的提问来源于stack exchange,提问作者Alitron
相关产品推荐
相关产品推荐

