Mongodb如何获取所有timestamp为最大值的顶部文档
MongoDB查询所有timestamp取最大值的文档实现方案
有更优的实现方式,根据你的数据量大小可以选择以下两种方案:
方案1:单聚合查询(适合小数据量场景)
仅需一次请求即可拿到结果,无需提前查询最大timestamp值,注意该方案受MongoDB聚合默认100MB内存限制,不适合大数据量集合使用,示例代码如下:
db.collectionName.aggregate([ // 计算全局最大timestamp,同时暂存所有文档 { $group: { _id: null, maxTimestamp: { $max: "$timestamp" }, allDocs: { $push: "$$ROOT" } } }, // 拆解文档数组 { $unwind: "$allDocs" }, // 过滤出timestamp等于最大值的文档 { $match: { $expr: { $eq: ["$allDocs.timestamp", "$maxTimestamp"] } } }, // 还原为原始文档结构 { $replaceRoot: { newRoot: "$allDocs" } } ])
方案2:两次查询(适合大数据量场景,性能更优)
你原本的思路在数据量较大时反而性能更好,尤其是timestamp字段建立了索引的情况下,两次查询均会命中索引,时间复杂度为O(logN),不会全表扫描,也不会出现聚合暂存大量文档导致的内存溢出问题,示例代码如下:
// 第一步:查询最大的timestamp值 const maxTimestamp = db.collectionName.find().sort({ timestamp: -1 }).limit(1).next().timestamp; // 第二步:匹配所有等于该值的文档 const result = db.collectionName.find({ timestamp: maxTimestamp }).toArray();
两种方案的选择建议
- 集合文档数小于10万:优先选择聚合方案,代码更简洁,仅需一次数据库请求
- 集合文档数大于10万/部署为分片集群:优先选择两次查询方案,性能更高,资源占用更低,兼容性更好
内容的提问来源于stack exchange,提问作者Thomas Gak-Deluen
相关产品推荐
相关产品推荐

