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

