我什么时候绝对需要 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 个结果比一直执行该聚合要快得多。