MongooseJS是否填充反模式?

时间:2018-04-09 00:00:35

标签: javascript node.js mongodb mongoose

我发现多个帖子和指南称赞使用populate()方法在Mongoose和MongoDB中进行连接的能力。

这让我很困惑。如果要进行连接,是否应该使用SQL数据库?不应该加入MongoDB作为最后的手段吗?

使用populate()的每个对象都需要执行第二次查询来获取该数据。因此,如果您在查询中获取100个项目,则需要再执行100个查询来获取该数据。这听起来像存储它作为嵌套方案是一种更好的想法。

我错了吗? populate()实际上是一个有意义的好方法吗?或者我是对的,你可以在应该避免的情况下使用它是最后的选择吗?

1 个答案:

答案 0 :(得分:1)

populate()不会为每个父文档的每个子文档发送find个请求。

它会在过滤器中发送一个包含所有子ObjectIds(所有父项!)的单find

示例(mongoose.set('debug', true)控制台输出):

Mongoose: parent.find({}, { fields: {} })   // was called with populate()
Mongoose: child.find({ _id: { '$in': [ ObjectId(A), ObjectId(B), ...] }})

然后可能"加入"父母对节点中的孩子。

基本上,只添加了1个RTT。为了尽可能地避免这种情况,我对一些用于常见用例的模式进行了非规范化。