MST

星途 面试题库

面试题:MongoDB聚合框架复杂分页场景优化

在一个大型电商数据库中,商品集合包含众多字段和海量文档。现在需要在聚合框架下实现分页,不仅要根据商品销量降序排序,还要过滤掉库存为0的商品,同时在分页过程中要考虑性能优化,尽可能减少内存使用和查询时间。请详细描述实现思路并给出聚合管道代码示例,同时说明在高并发场景下如何进一步优化。
50.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 过滤库存为0的商品:使用 $match 阶段,通过条件筛选出库存不为0的商品文档。
  2. 按商品销量降序排序:利用 $sort 阶段,以商品销量字段为依据进行降序排列。
  3. 分页处理:采用 $skip$limit 阶段来实现分页功能,$skip 用于跳过指定数量的文档,$limit 用于限制返回的文档数量。

聚合管道代码示例(以MongoDB为例)

假设商品集合名为 products,库存字段为 stock,销量字段为 sales

const page = 2; // 页码
const pageSize = 10; // 每页数量
const skip = (page - 1) * pageSize;

db.products.aggregate([
    { $match: { stock: { $gt: 0 } } },
    { $sort: { sales: -1 } },
    { $skip: skip },
    { $limit: pageSize }
]);

高并发场景下的优化

  1. 索引优化
    • 为库存字段 stock 和销量字段 sales 创建复合索引,如 db.products.createIndex({ stock: 1, sales: -1 })。这样在 $match$sort 阶段能快速定位和排序文档,提高查询效率。
  2. 缓存机制
    • 引入缓存系统,如Redis。将分页查询结果缓存起来,相同的分页请求直接从缓存中获取数据,减少数据库压力。例如,使用Redis的 SETGET 命令存储和读取分页数据。
  3. 读写分离
    • 采用读写分离架构,主库负责写操作,从库负责读操作。在高并发读场景下,将分页查询请求分发到多个从库,均衡负载,提高系统整体性能。
  4. 异步处理
    • 对于一些非关键操作,如记录查询日志等,可以采用异步处理方式,避免阻塞分页查询的主流程,从而提高系统响应速度。