1

我正在一个平台上工作,我在所有查询中使用 mongoose .populate 次数,我打开 mongoose 调试模式,发现查询执行时间几乎没有差异(现在 100 个文档,将有 100000 个文档将来)使用填充和不使用填充。

我知道基本上填充也在内部进行 finOne 查询,我的问题是,使用.populate会增加我的查询时间,或者如果记录数量达到数百万,它是否会影响我的性能。还有我可以选择的任何替代方案来提高性能吗

4

1 回答 1

2

一般来说,你是对的 - 你想避免使用 populate() 因为它会为每一行发出另一个查询。请记住,这是到服务器的完整往返。Mongo 没有任何类型的连接概念,因此当您填充时,您将为返回集中的每一行发出额外的查询。

解决此问题的技术是对数据进行非规范化 - 不要设计像关系数据库那样的 mongo 数据库。mongo 文档有很多关于如何做到这一点的信息。https://docs.mongodb.org/manual/core/data-model-design/ Mongo 设计要记住的一件重要事情是,您永远不希望拥有无限增长的子文档。由于 mongo 空间分配和分页的工作方式,这可能会导致严重的性能问题,因此如果您处于这种情况,最好进行规范化。

另一种非常常见的技术是子文档缓存。这是您从“加入”集合中获取部分数据并将其缓存在您正在查询的集合中的地方。在这种情况下,您是在用空间换取性能,因为您有重复的数据。此外,您必须确保在发生更改时保持数据更新。使用 mongoose,很容易将其作为一个保存后的钩子在外国收藏的模型上进行。

于 2015-10-21T07:34:08.790 回答