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
相关产品推荐
相关产品推荐

