我在一个平台上工作,我在所有查询中使用mongoose .populate次数,我打开mongoose调试模式,发现查询执行时间几乎没有差异(现在100个文档,将会有使用populate而不使用populate,将来是100000 doc。
我知道基本上populate也在内部进行finOne查询,我的问题是,使用.populate
会增加我的查询时间,或者如果记录数达到数百万,它是否会影响我的性能。还有我可以选择提高性能的替代方案
答案 0 :(得分:1)
一般来说,你是对的 - 你想避免使用populate(),因为它会为每一行发出另一个查询。请记住,这是服务器的完整往返。 Mongo没有任何关于连接的概念,所以当你填充时,你会为你返回的集合中的每一行发出一个额外的查询。
解决此问题的方法是对数据进行非规范化 - 不要像关系数据库那样设计mongo数据库。 mongo文档有很多关于如何执行此操作的信息。 https://docs.mongodb.org/manual/core/data-model-design/使用Mongo设计时要记住的一件重要事情是,您永远不希望拥有无限增长的子文档。由于mongo空间分配和分页的工作方式,这可能会导致严重的性能问题,所以如果您遇到这种情况,最好进行规范化。
另一种非常常见的技术是子文档缓存。这是您从“已加入”集合中获取部分数据并将其缓存在您正在查询的集合上的位置。在这种情况下,由于您有重复数据,因此您需要交换空间以获得性能。此外,您必须确保在发生更改时保持数据更新。使用mongoose,很容易将其作为外国集合模型上的后保存挂钩。