我什么时候绝对需要 MongoDB 聚合中的 $out 运算符?
When do I absolutely need the $out operator in MongoDB aggregation?
MongoDB 关于 $out 的聚合文档说:
"Takes the documents returned by the aggregation pipeline and writes them to a specified collection. The $out operator must be the last stage in the pipeline. The $out operator lets the aggregation framework return result sets of any size."
https://docs.mongodb.org/manual/reference/operator/aggregation/out/
因此,一个问题可能是聚合可能 运行 内存不足或使用大量内存。但是 $out 在这里会有什么帮助,最终如果聚合返回很多桶,它们将首先保存在内存中。
当你有一个需要很长时间计算但不需要一直最新的用例时,$out 运算符很有用。
假设您有一个网站,您希望在该网站上列出当前首页上最热门的前十篇文章(过去 60 分钟内点击次数最多)。要创建此统计信息,您需要使用如下管道解析访问日志集合:
- $匹配最后一小时
- $group by article-id 和 user 过滤掉重新加载
- $group 再次按 article-id 获取每篇文章和用户的点击数
- $按计数排序。
- $限制为 10 个结果
当您拥有一个包含大量内容的非常受欢迎的网站时,这可能是一个负载非常重的聚合。当您将它放在首页上时,您需要为每一个首页点击都执行此操作。这会对您的数据库造成相当大的负载,并大大拖慢加载时间。
我们如何解决这个问题?
我们不是在每次点击页面时都执行该聚合,而是每分钟使用一个 cronjob 执行一次,该 cronjob 使用 $out 将聚合的前十名列表放入一个新集合中。然后,您可以直接查询该集合中的缓存结果。从包含 10 个文档的集合中获取所有 10 个结果比一直执行该聚合要快得多。
MongoDB 关于 $out 的聚合文档说:
"Takes the documents returned by the aggregation pipeline and writes them to a specified collection. The $out operator must be the last stage in the pipeline. The $out operator lets the aggregation framework return result sets of any size."
https://docs.mongodb.org/manual/reference/operator/aggregation/out/
因此,一个问题可能是聚合可能 运行 内存不足或使用大量内存。但是 $out 在这里会有什么帮助,最终如果聚合返回很多桶,它们将首先保存在内存中。
当你有一个需要很长时间计算但不需要一直最新的用例时,$out 运算符很有用。
假设您有一个网站,您希望在该网站上列出当前首页上最热门的前十篇文章(过去 60 分钟内点击次数最多)。要创建此统计信息,您需要使用如下管道解析访问日志集合:
- $匹配最后一小时
- $group by article-id 和 user 过滤掉重新加载
- $group 再次按 article-id 获取每篇文章和用户的点击数
- $按计数排序。
- $限制为 10 个结果
当您拥有一个包含大量内容的非常受欢迎的网站时,这可能是一个负载非常重的聚合。当您将它放在首页上时,您需要为每一个首页点击都执行此操作。这会对您的数据库造成相当大的负载,并大大拖慢加载时间。
我们如何解决这个问题?
我们不是在每次点击页面时都执行该聚合,而是每分钟使用一个 cronjob 执行一次,该 cronjob 使用 $out 将聚合的前十名列表放入一个新集合中。然后,您可以直接查询该集合中的缓存结果。从包含 10 个文档的集合中获取所有 10 个结果比一直执行该聚合要快得多。