猫鼬如何在引擎盖下填充工作

How does mongoose populate work under the hood

有人能告诉我怎么做吗

我有一个collection

a {
 b: String
 c: Date
 d: ObjectId --> j
}

j {
 k: String
 l: String
 m: String
}

当我执行:

a.find({ b: 'thing' }).populate('d').exec(etc..)

在后台,这实际上是针对 MongoDB 执行两次查询,以便 return 所有项目 'j'?

我对填充工作没有任何问题,我担心的是任务的性能影响。

谢谢

Mongoose 使用两个查询来完成请求。

查询a集合获取与主查询匹配的文档,然后查询j集合填充文档中的d字段。

您可以通过启用调试输出来查看 Mongoose 正在使用的查询:

mongoose.set('debug', true);

基本上,模型“a”包含一个属性“d”,它引用(指向)模型“j'.

所以每当我们使用

a.find({ b: 'thing' }).populate('d').exec(etc..)

然后通过填充我们可以单独调用 'j' 的属性,例如:

  • d.k
  • d.l
  • d.m

Populate() 帮助我们调用其他模型的属性。

添加到@JohnnyHK 关于您担心的任务的性能影响的回答,我相信无论如何,无论我们使用 mongoose 提供的 populate() 方法还是您将使用的方法,这些查询都必须按顺序执行服务端实现,两者时间复杂度相同

这是因为为了填充我们需要第一个查询的结果,得到结果后 uuid 将用于查询另一个集合中的文档。

所以我认为在服务器端进行这些更改比使用 mongoose 提供的方法更浪费。性能将保持不变。