You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:54:06