mongoose populate 方法

populate 是 Mongoose 用于把 ObjectId 引用字段解析成真实文档的方法,便于在查询结果中直接拿到关联对象。

来源整理自:vue3js.cn 面试官系列

简述

将查询到的数据中保存的引用 ID,替换为真实被引用文档的内容;可通过 select 选择需要或不需要返回的字段。

补充

补充:populate 的常见用法与注意事项。

const Tour = require('./models/Tour');

// 1) 单字段 populate:把 guides 字段由 id 数组填充为 User 文档数组
const tour = await Tour.findById(req.params.id).populate({
  path: 'guides',
  select: '-__v -passwordResetToken -passwordResetExpires'
});

// 2) 嵌套 populate:populate 的对象本身就支持继续 populate
await Tour.findById(id).populate({
  path: 'guides',
  populate: { path: 'posts', select: 'title' },
});

// 3) 查询中间件:每次 find 自动 populate
tourSchema.pre(/^find/, function (next) {
  this.populate({ path: 'guides', select: 'name role' });
  next();
});
  • populate 本质上是额外的一次 find,会发送多条 SQL/mongo 查询;大批量场景下请使用 lean() 或手动 $lookup。
  • 字段必须是 ref 指向的 ObjectId,否则 populate 不会生效。
  • 性能优化:.populate({ match: { active: true } }) 可先过滤再回填。