【问题标题】:mongodb caching with aggregation pipeline带有聚合管道的mongodb缓存
【发布时间】:2020-01-03 10:23:28
【问题描述】:

mongodb 聚合管道之类的

db.testing.aggregate(
    { 
    $match : {hosting : "aws.amazon.com"}
    },
    { 
    $group : { _id : "$hosting", total : { $sum : 1 } }
    },
    {
    $project : { title : 1 , author : 1, <few other transformations> }
    {$sort : {total : -1}}
);

现在我想启用分页。我有两个选择。

  1. 在管道中使用跳过和限制。

    { $skip : pageNumber * pageSize }
    { $limit : pageSize }
    

可以为每个页面使用外部 API 级别缓存,这将减少重复加载相同页面的时间,但由于排序导致的线性扫描,每个页面的第一次加载会很痛苦。

  1. 在应用程序中处理分页。
    • 缓存 findAll 结果,即 List findAll();
    • 现在分页将在服务层处理并发布结果
    • 从下一个请求开始,您将引用缓存的结果并从缓存中发送所需的记录集。

问题:如果数据库没有做一些神奇的优化,第二种方法似乎更好。首先,我的观点是,由于管道涉及排序,因此每个页面请求都会扫描整个表,这将是次优的。你有什么看法?应该做哪一个?你会选择什么?什么是好的做法(是否建议将一些数据库逻辑移动到服务层以进行优化)?

【问题讨论】:

    标签: pagination aggregation-framework query-optimization spring-webflux


    【解决方案1】:

    这取决于您的数据。

    MongoDB 不会缓存查询结果以返回相同查询的缓存结果。 https://docs.mongodb.com/manual/faq/fundamentals/#does-mongodb-handle-caching

    但是,您可以创建View(来自源+管道)并更新它on-demand。这将允许您拥有具有良好性能的聚合数据,用于分页并定期更新内容。您可以创建索引以获得更好的性能(无需在服务层开发额外的逻辑)

    另外,如果你总是通过 hosting 字段过滤和$group,你可能会在最后一个 $sort 下一个 $match 阶段受益于 MongoDB 索引交换。在这种情况下,MongoDB 将使用索引进行过滤+排序,并且分页在内存中完成。

    db.testing.createIndex({hosting:-1})
    
    db.collection.aggregate([
      {
        $match: {
          hosting: "aws.amazon.com"
        }
      },
      {
        $sort: {
          hosting: -1
        }
      },
      {
        $group: {
          _id: "$hosting",
          title: {
            $first: "$title"
          },
          author: {
            $first: "$author"
          },
          total: {
            $sum: 1
          }
        }
      },
      {
        $project: {
          title: 1,
          author: 1,
          total: 1
        }
      },
      { $skip : pageNumber * pageSize },
      { $limit : pageSize }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2020-09-20
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多