Relations 和 Populate API 文档
版本: v2.0.0 最后更新: 2026-06-01
Model 层提供 relations 和 populate 功能,让你轻松处理集合之间的关联关系。
快速开始
1分钟上手
核心特性
- ✅ 极简配置 - 只需 4 个字段定义关系
- ✅ 接近 MongoDB 原生 - 直接对应
$lookup操作 - ✅ 链式调用 - 支持
.populate().populate()链式语法 - ✅ 批量优化 - 使用
$in避免 N+1 查询问题 - ✅ 丰富选项 - 支持 select/sort/limit/skip/match
关系类型
one-to-one(一对一)
场景: 用户 → 个人资料
one-to-many(一对多)
场景: 用户 → 文章列表
many-to-one(多对一)
场景: 文章 → 作者
Populate 选项
select - 选择字段
sort - 排序
limit - 限制数量
skip - 跳过
match - 额外查询条件
组合使用
高级用法
链式 populate
批量查询 + populate
动态关系(数组形式)
对象形式(完整配置)
性能优化
自动批量查询
索引建议
性能对比
边缘情况处理
外键为 null
找不到关联数据
外键数组
与 Mongoose 的对比
为什么选择 from 而不是 ref?
- 接近 MongoDB 原生 -
from是$lookup的原生字段 - 更灵活 - 不依赖 Model 是否定义,可关联任何集合
- 更直观 -
from: 'profiles'清楚知道查询 profiles 集合
完整示例
常见问题
Q: populate 会执行多少次查询?
A: 对于 N 个文档 + 1 个关系,执行 2 次查询:
- 查询主文档(N 个)
- 批量查询关联文档(使用
$in,1 次)
Q: 如何实现嵌套 populate?
A: 当前版本已支持嵌套 populate,推荐使用对象配置来表达下一层关系:
Q: populate 会影响性能吗?
A: 使用 $in 批量查询,性能影响较小。建议:
- 为外键字段创建索引
- 使用
select只返回需要的字段 - 使用
limit限制关联数据数量
Q: 如何实现 many-to-many?
A: v1.2.0 暂不直接支持,可通过中间表实现:
Q: populate 支持哪些选项?
A: 支持以下选项:
select- 字段选择sort- 排序limit- 限制数量skip- 跳过match- 额外查询条件
Q: 为什么我的 populate 返回 null?
A: 可能的原因:
- 外键字段值为 null/undefined
- 关联集合中没有匹配的文档
foreignField字段值不匹配
Q: 如何调试 populate?
A:
支持 populate 的查询方法
monSQLize 的 6 个查询方法都支持 populate:
1. find() + populate
批量查询,返回文档数组。
2. findOne() + populate
单文档查询,返回单个文档或 null。
3. findByIds() + populate
批量 ID 查询,返回文档数组。
4. findOneById() + populate
单 ID 查询,返回单个文档或 null。
5. findAndCount() + populate
带计数的查询,返回 { data, total } 结构。
6. findPage() + populate
分页查询,返回完整的分页结构。
特殊说明:
findAndCount和findPage只对data部分进行 populate- 其他字段(
total,page,pageSize,hasNext)保持不变 - 所有方法都支持链式 populate
API 参考
Model.define() relations 配置
.populate() 方法
PopulateOptions
更多资源
最后更新: 2026-06-01 版本: v2.0.0