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

MongoDB如何获取每pair最新文档后筛选ask.total最高的前10条

MongoDB聚合查询实现方案

你需要的功能可以通过MongoDB聚合管道的多阶段组合实现,两种兼容不同版本的写法如下:

版本要求:MongoDB 5.2及以上(推荐)

使用$top操作符直接提取每个分组的最新文档,执行效率更高:

db.你的集合名称.aggregate([
  // 按交易对pair分组,取每组updateStamp最大的最新文档
  {
    $group: {
      _id: "$pair",
      latestDoc: {
        $top: {
          sortBy: { updateStamp: -1 },
          output: "$$ROOT"
        }
      }
    }
  },
  // 将最新文档展开为根级结构
  {
    $replaceRoot: { newRoot: "$latestDoc" }
  },
  // 按ask.total字段降序排序
  {
    $sort: { "ask.total": -1 }
  },
  // 取前10条记录
  {
    $limit: 10
  }
])

兼容MongoDB 5.2以下版本

如果使用的是低版本MongoDB,可通过先排序再分组的逻辑实现:

db.你的集合名称.aggregate([
  // 全量数据按更新时间戳降序排序,确保每个交易对的最新数据排在最前
  {
    $sort: { updateStamp: -1 }
  },
  // 按交易对分组,取每组第一条即为最新文档
  {
    $group: {
      _id: "$pair",
      latestDoc: { $first: "$$ROOT" }
    }
  },
  // 展开文档结构
  {
    $replaceRoot: { newRoot: "$latestDoc" }
  },
  // 按ask.total降序排序
  {
    $sort: { "ask.total": -1 }
  },
  // 取前10条
  {
    $limit: 10
  }
], {
  // 数据量过大触发内存限制时可开启磁盘使用
  allowDiskUse: true
})

优化建议

  • 建议创建{pair: 1, updateStamp: -1}的联合索引,可大幅降低分组取最新数据的查询耗时
  • 若只需要特定字段返回,可在聚合最后添加$project阶段裁剪不需要的字段,减少数据传输开销

内容的提问来源于stack exchange,提问作者Ima Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:03