17

有人可以告诉我如何

我有一个收藏

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

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

当我执行:

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

在后台这实际上是对 MongoDB 执行两个查询以返回所有项目“j”吗?

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

谢谢

4

3 回答 3

26

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

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

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

mongoose.set('debug', true);
于 2015-02-13T16:38:03.950 回答
1

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

所以每当我们使用

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

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

  • dk
  • dl
  • 分米

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

于 2020-02-21T22:30:38.520 回答
1

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

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

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

于 2020-12-04T15:17:22.883 回答