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

如何用MongoDB聚合查询获取最小/最大日期的文档?

获取MongoDB集合中最小/最大日期文档的最优方案

要同时筛选出集合中包含最小DateTime和最大DateTime的文档,推荐用聚合管道实现,一次查询即可完成,比两次单独查询(排序+限制)更高效。以下是两种实用方案:

方案一:全局聚合+关联匹配(适合大数据量)

通过一次全集合扫描计算出最小/最大日期,再关联原集合匹配对应文档,性能最优。

db.your_collection_name.aggregate([
  // 计算全局最小、最大DateTime
  {
    $group: {
      _id: null,
      minDate: { $min: "$DateTime" },
      maxDate: { $max: "$DateTime" }
    }
  },
  // 将目标日期合并为数组,方便后续匹配
  {
    $project: {
      targetDates: ["$minDate", "$maxDate"],
      _id: 0
    }
  },
  // 关联原集合,匹配DateTime在目标数组中的文档
  {
    $lookup: {
      from: "your_collection_name",
      localField: "targetDates",
      foreignField: "DateTime",
      as: "matchedDocs"
    }
  },
  // 展开匹配到的文档数组
  { $unwind: "$matchedDocs" },
  // 恢复原文档结构输出
  { $replaceRoot: { newRoot: "$matchedDocs" } }
])

关键说明:

  • 替换your_collection_name为你的实际集合名称
  • 如果同一日期存在多个文档,会全部返回(符合“包含最小/最大日期的文档”需求)
  • 建议给DateTime字段创建索引:db.your_collection_name.createIndex({ DateTime: 1 }),大幅提升查询性能

方案二:分支聚合+结果合并(逻辑更直观)

用$facet同时执行两个分支聚合,分别获取最小/最大日期的文档,再合并结果。

场景1:返回所有最小/最大日期的文档

db.your_collection_name.aggregate([
  {
    $facet: {
      minDateDocs: [
        { $sort: { DateTime: 1 } },
        { $group: { _id: "$DateTime", docs: { $push: "$$ROOT" } } },
        { $sort: { _id: 1 } },
        { $limit: 1 },
        { $unwind: "$docs" },
        { $replaceRoot: { newRoot: "$docs" } }
      ],
      maxDateDocs: [
        { $sort: { DateTime: -1 } },
        { $group: { _id: "$DateTime", docs: { $push: "$$ROOT" } } },
        { $sort: { _id: -1 } },
        { $limit: 1 },
        { $unwind: "$docs" },
        { $replaceRoot: { newRoot: "$docs" } }
      ]
    }
  },
  // 合并两个分支的结果
  { $project: { combined: { $concatArrays: ["$minDateDocs", "$maxDateDocs"] } } },
  { $unwind: "$combined" },
  { $replaceRoot: { newRoot: "$combined" } }
])

场景2:仅返回最小/最大日期各一个文档

如果同日期有多条文档但只需要各取一条,可简化分支逻辑:

db.your_collection_name.aggregate([
  {
    $facet: {
      minDateDocs: [{ $sort: { DateTime: 1 } }, { $limit: 1 }],
      maxDateDocs: [{ $sort: { DateTime: -1 } }, { $limit: 1 }]
    }
  },
  { $project: { combined: { $concatArrays: ["$minDateDocs", "$maxDateDocs"] } } },
  { $unwind: "$combined" },
  { $replaceRoot: { newRoot: "$combined" } }
])

方案选择建议

  • 数据量较大时优先用方案一,仅需一次全集合扫描计算日期范围,性能更优
  • 逻辑简单、数据量较小时可选用方案二,代码可读性更高

内容的提问来源于stack exchange,提问作者Valerij Zotov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:45:38