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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:24:04