Populate API - 关联查询
传入非空 sort 时,关联记录按父文档逐个顺序查询,由 MongoDB 执行排序,遵从原生 null/missing、BSON、数组及关联集合的 collation 规则。skip、limit 应用于每个父文档的关联查询。这会比批读增加数据库查询次数。父查询的 collation 不会自动复制到关联读取。
无排序且无窗口时,ObjectId 等无歧义标量关联保持每批最多 200 个去重 key 的批读。字符串表示相同但 BSON 类型不同的 key(例如 1 和 '1')及复杂对象 key,保留原始值交给 MongoDB 逐父匹配,仍遵从既有 ObjectId 转换配置;此路径可能增加到每父一条关联查询。
其他字符串 key 批次中,每次 populate 读取一次实际目标库/池中关联集合的默认 collation;确认二进制规则后批读,其他规则交给 MongoDB 逐父查询以保留等值语义。元数据无权限、不可用或未知时也逐父查询,不要求额外授权才能返回正确匹配,不长期缓存该信息。此路径会增加一次元数据请求及最多每父一条关联查询。
功能: Model层关联查询,支持6个方法()
📖 概述
Populate 是 Model 层用于加载 relations 中声明的关联文档的能力。
本页 Model schema 示例使用 monSQLize 传入的 runtime 作用域 s 命名空间。应用代码不需要为了这些示例导入 root schema-dsl 入口。
核心特性
- ✅ 6个方法支持 - find/findOne/findByIds/findOneById/findAndCount/findPage()
- ✅ 链式API - 支持多个 populate 链式调用
- ✅ 智能缓存 - 关联查询结果可使用配置的缓存;效果取决于命中率、后端和负载
- ✅ 字段选择 - 只返回需要的字段,减少数据传输
- ✅ 排序限制 - 支持 sort 和 limit 控制关联数据
- ✅ 自动注入 - 结果自动注入到文档对象
🚀 快速开始
1. 定义关系
首先在 Model 定义中配置 relations:
2. 使用 populate
3. 多个 populate
4. 选项配置
📚 支持的查询方法
monSQLize 支持 6个查询方法 的 populate,:
示例
🎯 API 参考
.populate(path, options?)
添加关联查询到查询链。
参数:
path(String) - 关系路径,必须在 Model 的 relations 中定义options(Object, 可选) - Populate 选项
返回: PopulateProxy 对象(支持链式调用和 Promise)
选项:
示例:
💡 使用场景
场景1: 用户-文章 (hasMany)
场景2: 文章-作者 (belongsTo)
场景3: 用户-资料 (hasOne)
场景4: 多对多(通过中间表)
⚡ 性能优化
N+1 问题解决
❌ 传统方式(N+1问题):
✅ monSQLize Populate(批量查询):
以下两次查询示例假定非字符串关联 key、无排序/窗口、去重 key 不超过 200;字符串关联可能另读元数据或逐父查询,见页首。
智能缓存
Populate + 缓存:
性能特征:
查询次数减少是结构特征,延迟仍取决于工作负载。请按性能证据契约测量。
缓存策略
🆚 与 Mongoose 对比
支持方法数对比
性能测量示例
应对相同数据集记录冷、热路径分布,不能从此控制流示例推导固定倍率;参见性能证据。
API 对比
❓ 常见问题
Q1: populate 后能不能缓存?
A: ✅ 可以!这是 monSQLize 的独家优势。
Q2: 如何避免 N+1 问题?
A: 二进制批读关系避免逐父查询;排序、窗口及字符串非二进制/未知规则按页首说明使用原生查询路径。
无排序/窗口且使用 ObjectId 等非字符串 key 的 populate 使用批量查询;字符串规则与回退查询次数见页首:
Q3: 能不能嵌套 populate?
A: 当前版本已支持嵌套 populate,可直接在 populate 配置中声明下一层关系。
Q4: populate 会影响性能吗?
A: 不会,反而性能更好。
- ✅ 批量查询(避免 N+1)
- ✅ 智能缓存(对目标负载测量命中率、后端时延和失效成本)
- ✅ 字段选择(减少数据传输)
Q5: 关系定义后必须 populate 吗?
A: 不是,populate 是可选的。
Q6: populate 支持条件过滤吗?
A: 支持。使用 match、limit 等选项即可约束被填充的数据。
📝 完整示例
博客系统示例
🔗 相关文档
- Relations API - 关系定义详解
- Model API - Model 层完整文档
- Cache API - 缓存配置
- FindPage API - 分页查询