TypeScript中使用Mongoose如何实现多字段populate及查询原理?
TypeScript下Mongoose多路径populate问题解答
报错问题修复
你遇到的TS报错根本原因是:populate 是Mongoose Query 实例上的方法,如果你在调用populate之前就通过await/then()将Query转换为Promise,返回的就是最终文档对象,自然不存在populate属性。
正确写法如下:
// 写法1:链式调用所有populate后再执行await/exec const stories = await Story .find({/* 你的查询条件 */}) .populate('fans') .populate('author') .exec(); // 写法2:拆分Query操作,适合动态拼接populate的场景 const query = Story.find({/* 你的查询条件 */}); query.populate('fans'); // 可以加逻辑判断是否需要populate对应路径 if (needAuthor) { query.populate('author'); } const stories = await query.exec();
多路径populate底层逻辑
- 链式调用多个
populate时,每个关联路径都会单独发起一次数据库查询,不会合并为一次查询。因为MongoDB本身不支持原生联表查询,population是Mongoose在应用层实现的封装逻辑,执行流程为:- 先执行主查询,拿到原始的主集合文档列表
- 提取第一个populate路径关联的所有id,去对应关联集合做批量查询,替换主文档的对应字段
- 对剩下的每个populate路径依次执行相同的查询、替换操作
- 所有路径处理完成后返回最终结果
- 你提到的分别await处理的方案是可以实现相同效果的,只要你调用的是文档实例的
populate方法,示例如下:// 先拿到原始主文档 const story = await Story.findOne({/* 条件 */}).exec(); // 分别await每个路径的populate,效果和链式调用完全一致,性能也没有差异 await story.populate('fans'); await story.populate('author');
内容的提问来源于stack exchange,提问作者user2921009
相关产品推荐
相关产品推荐

