【发布时间】: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}}
);
现在我想启用分页。我有两个选择。
-
在管道中使用跳过和限制。
{ $skip : pageNumber * pageSize } { $limit : pageSize }
可以为每个页面使用外部 API 级别缓存,这将减少重复加载相同页面的时间,但由于排序导致的线性扫描,每个页面的第一次加载会很痛苦。
- 在应用程序中处理分页。
- 缓存 findAll 结果,即 List findAll();
- 现在分页将在服务层处理并发布结果
- 从下一个请求开始,您将引用缓存的结果并从缓存中发送所需的记录集。
问题:如果数据库没有做一些神奇的优化,第二种方法似乎更好。首先,我的观点是,由于管道涉及排序,因此每个页面请求都会扫描整个表,这将是次优的。你有什么看法?应该做哪一个?你会选择什么?什么是好的做法(是否建议将一些数据库逻辑移动到服务层以进行优化)?
【问题讨论】:
标签: pagination aggregation-framework query-optimization spring-webflux