面试题答案
一键面试实现思路
- 过滤库存为0的商品:使用
$match
阶段,通过条件筛选出库存不为0的商品文档。 - 按商品销量降序排序:利用
$sort
阶段,以商品销量字段为依据进行降序排列。 - 分页处理:采用
$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 }
]);
高并发场景下的优化
- 索引优化:
- 为库存字段
stock
和销量字段sales
创建复合索引,如db.products.createIndex({ stock: 1, sales: -1 })
。这样在$match
和$sort
阶段能快速定位和排序文档,提高查询效率。
- 为库存字段
- 缓存机制:
- 引入缓存系统,如Redis。将分页查询结果缓存起来,相同的分页请求直接从缓存中获取数据,减少数据库压力。例如,使用Redis的
SET
和GET
命令存储和读取分页数据。
- 引入缓存系统,如Redis。将分页查询结果缓存起来,相同的分页请求直接从缓存中获取数据,减少数据库压力。例如,使用Redis的
- 读写分离:
- 采用读写分离架构,主库负责写操作,从库负责读操作。在高并发读场景下,将分页查询请求分发到多个从库,均衡负载,提高系统整体性能。
- 异步处理:
- 对于一些非关键操作,如记录查询日志等,可以采用异步处理方式,避免阻塞分页查询的主流程,从而提高系统响应速度。