Javascript 猫鼬是一种反模式吗?
我发现有多篇文章和指南赞扬使用Javascript 猫鼬是一种反模式吗?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我发现有多篇文章和指南赞扬使用populate()方法在Mongoose和MongoDB中进行连接的能力 这让我很困惑。如果要进行连接,是否应该使用SQL数据库?加入MongoDB难道不是最后的选择吗 使用populate()的每个对象都需要执行第二次查询以获取该数据。因此,如果在一个查询中获取100个项目,则需要执行另外100个查询来获取该数据。听起来,如果可能的话,将其存储为嵌套方案是一种更好的方法 我错了吗?populate()?或者我说这是一个万不得已的选择,您可以在应该避免的情况下使用
populate()
方法在Mongoose和MongoDB中进行连接的能力
这让我很困惑。如果要进行连接,是否应该使用SQL数据库?加入MongoDB难道不是最后的选择吗
使用populate()
的每个对象都需要执行第二次查询以获取该数据。因此,如果在一个查询中获取100个项目,则需要执行另外100个查询来获取该数据。听起来,如果可能的话,将其存储为嵌套方案是一种更好的方法
我错了吗?populate()?或者我说这是一个万不得已的选择,您可以在应该避免的情况下使用它吗?populate()不会为每个父文档的每个子文档发送find
请求
它发送一个包含过滤器中所有子对象(所有父对象!)的find
示例(mongoose.set('debug',true)
控制台输出):
然后可能将父节点“连接”到节点中的子节点
因此,基本上只添加了1个RTT。为了尽可能避免这种情况,我对一些常见用例的模式进行了非规范化。请参阅本文末尾的图表,需要加入的对象越多,速度就越慢。本文不是在讨论populate()。。。(但是大约$lookup)。根据控制台输出,根据这个问题:(查看2017年10月的评论)populate没有在引擎盖下使用$lookup。我明白了。回到原来的问题。“填充”真的是人们所说的一个伟大的解决方案吗?它应该像SQL中的连接一样使用,还是开发人员应该尝试以一种节省使用填充的方式来设计他们的方案?在将populate()添加到库中之前,人们手动完成了所有这些“连接”工作。。所以这个新功能对他们中的许多人来说是天赐之物。就选择DB而言,有很多权衡和需要考虑的事情。
Mongoose: parent.find({}, { fields: {} }) // was called with populate()
Mongoose: child.find({ _id: { '$in': [ ObjectId(A), ObjectId(B), ...] }})