如何在MongoDB查询中对嵌套对象排序后提取指定分页数据集
优化方案
你可以将排序、分页逻辑全部放在MongoDB聚合管道内完成,无需将全量匹配数据拉取到应用层处理,改造后代码如下:
const start_index = (current_page - 1) * posts_per_page const page_size = posts_per_page const shortened = await EachWay.aggregate([ { $unwind: "$data" }, { $match: filters }, // 数据库层面完成排序,按rating降序排列,可提前给data.rating建立索引提升排序效率 { $sort: { "data.rating": -1 } }, // 跳过前面页的所有数据 { $skip: start_index }, // 仅返回当前页需要的条数 { $limit: page_size }, // 直接合并字段输出目标格式,无需应用层二次处理 { $replaceRoot: { newRoot: { $mergeObjects: [ "$data", { bookmaker: "$bookmaker", sport: "$sport" } ] } } }, { $project: { _id: 0 } } ])
优化说明
- 改造后数据库仅会返回当前页的10条数据,不管匹配的总数据量是10万还是更多,都不会产生全量数据传输的开销
- 若你的数据量达到百万级以上,
$skip阶段的性能会有所下降,此时可以改用游标分页方案:每次请求返回结果时带上当前页最后一条数据的rating值,下一次请求在$match阶段新增"data.rating": { $lt: 上一页最后一条rating值 }的条件,去掉$skip阶段,分页效率会更高。
内容的提问来源于stack exchange,提问作者willmahoney
相关产品推荐
相关产品推荐

