MongoDB聚合中如何基于两个日期时间范围查询数据?
问题原因
常规的$match查询语法无法引用聚合阶段(比如$addFields)生成的字段,你写的$gte: "$FromDate"会被MongoDB当作字符串字面量处理,而不是指向之前生成的FromDate字段,所以匹配失效。
解决方案
改用$expr编写匹配逻辑,它支持在查询中引用文档字段(包括聚合阶段生成的字段),通过表达式完成日期范围判断:
修改后的聚合代码如下:
const Objdata = await Events.aggregate([ { $lookup: { from: "MeetingReminderSetting", let: { flag: false, cid: "$ClientID", esd: "$EventStartDtByTimeZone", }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$IsDeleted", "$$flag"] }, { $eq: ["$ClientID", "$$cid"] }, ], }, }, }, ], as: "p1", }, }, { $unwind: { path: "$p1", preserveNullAndEmptyArrays: false, }, }, { $addFields: { FromDate: { $dateAdd: { startDate: new Date("2022-01-01T00:00:00.000+00:00"), unit: "hour", amount: 24, }, }, Todate: { $dateAdd: { startDate: { $dateAdd: { startDate: new Date("2022-01-01T00:00:00.000+00:00"), unit: "hour", amount: 24, }, }, unit: "minute", amount: 10, }, }, }, }, // 修改后的$match阶段 { $match: { $expr: { $and: [ { $gte: ["$EventStartDtByTimeZone", "$FromDate"] }, { $lte: ["$EventStartDtByTimeZone", "$Todate"] } ] } } }, ]);
额外说明
- 无需用
$dateToString转换日期后比较:直接比较Date类型值才是正确的日期逻辑,字符串比较按字符顺序判断,可能出现不符合预期的结果(比如"2023-12-01"和"2023-2-01"的字符串顺序与日期顺序不一致)。 - 若
FromDate和Todate仅用于范围匹配,可进一步优化:将日期计算直接放到$expr里,省去$addFields阶段以减少内存占用,示例如下:
// 优化后的聚合(去掉$addFields,直接在$match里计算日期) const Objdata = await Events.aggregate([ { $lookup: { from: "MeetingReminderSetting", let: { flag: false, cid: "$ClientID", esd: "$EventStartDtByTimeZone", }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$IsDeleted", "$$flag"] }, { $eq: ["$ClientID", "$$cid"] }, ], }, }, }, ], as: "p1", }, }, { $unwind: { path: "$p1", preserveNullAndEmptyArrays: false, }, }, { $match: { $expr: { $and: [ { $gte: [ "$EventStartDtByTimeZone", { $dateAdd: { startDate: new Date("2022-01-01T00:00:00.000+00:00"), unit: "hour", amount: 24 } } ] }, { $lte: [ "$EventStartDtByTimeZone", { $dateAdd: { startDate: { $dateAdd: { startDate: new Date("2022-01-01T00:00:00.000+00:00"), unit: "hour", amount: 24 } }, unit: "minute", amount: 10 } } ] } ] } } }, ]);
内容的提问来源于stack exchange,提问作者SAHIL SINGH
相关产品推荐
相关产品推荐

