深度 Populate(嵌套填充)功能文档
🎯 功能概述
深度 populate 允许你在填充关联数据时,进一步填充关联数据的关联数据,形成多层嵌套的数据结构。
本页 Model schema 示例使用 monSQLize 传入的 runtime 作用域 s 命名空间。应用代码不需要为了这些示例导入 root schema-dsl 入口。
📖 使用方法
1. 基本嵌套 populate
填充 posts 关联,然后进一步填充 posts.comments 关联:
2. 嵌套 populate 对象配置
嵌套 populate 也支持完整的配置选项:
3. 多层嵌套 populate
支持 3 层或更多层的嵌套:
4. 嵌套多个 populate
在嵌套层级可以同时填充多个关联:
5. 混合使用链式和嵌套 populate
可以同时使用链式 populate 和嵌套 populate:
📋 完整示例
Model 定义
查询示例
运行时行为
- 一级 populate 可以直接读取
from指向的集合。 - 如果
from命中已注册 Model,monSQLize 会通过该 Model hydrate 关联文档。 - nested populate 只有在关联集合存在已注册 Model 时才会继续,因为下一跳关系需要从该 Model 定义中读取。
select、sort、skip、limit会在关联文档加载后应用。- nested populate 带有深度和循环保护;嵌套配置无效时会抛出面向用户的参数错误。
⚠️ 注意事项
1. 为嵌套分支定义 Model
一级 populate 可以从集合读取普通关联文档。nested populate 需要关联集合有 Model 定义,否则下一跳没有 relations 元数据:
2. 性能考虑
nested populate 会执行多次数据库查询。建议保持关系图浅层,并为外键创建索引:
优化建议:
- 使用
select只选择必要字段 - 使用
limit限制关联数据数量 - 除非用户路径确实需要,否则避免过深的嵌套关系图
3. 循环引用
避免循环引用导致无限递归:
解决方案:谨慎设计嵌套路径,设置明确限制,并避免双向嵌套链。
📊 兼容性
🧪 测试用例
完整测试用例请参考:
test/integration/model/model-features.test.tstest/integration/model/model-schema-and-hooks.test.ts
测试覆盖:
- ✅ 基本嵌套 populate
- ✅ 嵌套 populate 对象配置
- ✅ 3 层嵌套
- ✅ 嵌套多个 populate
- ✅ 混合链式和嵌套