MongoDB如何无需硬编码匹配集合中最近2年的记录?
无需硬编码获取MongoDB集合最近2年记录的方案
要实现基于集合内最新记录年份筛选最近2年的数据,不用硬编码日期,可以通过两种方式实现:
方式一:纯聚合管道一次性完成
全程用MongoDB聚合操作,先找出集合里的最新记录日期,再计算2年前的日期,最后筛选符合范围的记录:
db.yourCollection.aggregate([ // 1. 获取集合中最新的fechaOrden日期 { $group: { _id: null, maxFecha: { $max: "$fechaOrden" } } }, // 2. 计算最新日期往前推2年的起始日期(MongoDB 5.0+支持$dateSubtract) { $addFields: { minFecha: { $dateSubtract: { startDate: "$maxFecha", unit: "year", amount: 2 } } } }, // 3. 关联原集合,筛选出日期在[minFecha, maxFecha]之间的记录 { $lookup: { from: "yourCollection", let: { minF: "$minFecha", maxF: "$maxFecha" }, pipeline: [ { $match: { $expr: { $and: [ { $gte: ["$fechaOrden", "$$minF"] }, { $lte: ["$fechaOrden", "$$maxF"] } ] } } } ], as: "recentTwoYearsRecords" } }, // 可选:将结果展开为单条记录格式(按需调整) { $unwind: "$recentTwoYearsRecords" }, { $replaceRoot: { newRoot: "$recentTwoYearsRecords" } } ])
如果你的MongoDB版本低于5.0,用$subtract计算近似的2年前日期(注意:会忽略闰年,精度略有误差):
// 替换上面$addFields里的minFecha字段 minFecha: { $subtract: ["$maxFecha", 2 * 365 * 24 * 60 * 60 * 1000] }
方式二:分两步获取日期范围再聚合
这种方式更直观,适合新手理解:先单独查询出最新记录的日期,计算出2年前的日期,再带入聚合管道做筛选:
// 第一步:获取集合中最新的fechaOrden日期 const maxFecha = db.yourCollection.findOne({}, { fechaOrden: 1, _id: 0 }, { sort: { fechaOrden: -1 } }).fechaOrden; // 第二步:计算2年前的日期 const minFecha = new Date(maxFecha); minFecha.setFullYear(maxFecha.getFullYear() - 2); // 第三步:用计算好的日期范围做聚合筛选 db.yourCollection.aggregate([ { $match: { fechaOrden: { $gte: minFecha, $lte: maxFecha } } }, // 这里可以添加你的后续聚合阶段... ])
两种方式都能避免硬编码日期,自动适配集合内的最新记录年份。比如集合最新记录是2021年,会自动筛选2019-2021年的数据。
内容的提问来源于stack exchange,提问作者lemon-dev
相关产品推荐
相关产品推荐

