MongoDB查询dd/mm/YYYY格式日期大于指定值的全记录方法
问题根因
你写的聚合查询仅返回insertDate字段,核心原因是$project阶段的输出规则:只有显式声明的字段才会保留在返回结果中。你在$project中仅配置了insertDate的日期转换逻辑,没有指定保留其他原文档字段,匹配完成后自然无法拿到完整记录。另外你当前查询的匹配阈值写的是2022-01-01,和你实际需要筛选insertDate大于28/01/2022的需求也不匹配。
可用解决方案
方案1:用$addFields替代$project做类型转换(推荐)
$addFields阶段只会新增或覆盖你指定的字段,不会移除原文档的其他字段,写法简单且能直接返回完整文档:
db.xyz.aggregate([ { $addFields: { // 将字符串格式的insertDate转换为MongoDB日期类型,其余字段自动保留 insertDate: { $dateFromString: { format: '%d/%m/%Y', dateString: '$insertDate' } } } }, { $match: { // 修正阈值为需求中的2022年1月28日 insertDate: { $gt: new Date("2022-01-28") } } } ])
如果你不需要把转换后的日期类型永久覆盖原
insertDate字段,可以把转换后的字段起个临时名(比如convertedInsertDate),在$match阶段用这个临时字段匹配,最后再加一个$unset阶段移除临时字段即可,不会改动原字段的存储值。
方案2:直接在$match阶段做表达式判断,无需提前转换字段
这种写法不需要单独的类型转换阶段,逻辑更短,匹配后直接返回完整原文档:
db.xyz.aggregate([ { $match: { $expr: { $gt: [ { $dateFromString: { format: '%d/%m/%Y', dateString: '$insertDate' } }, new Date("2022-01-28") ] } } } ])
注意事项
- 存储日期时建议直接使用MongoDB原生Date类型,不要存成
dd/mm/YYYY格式的字符串,能大幅提升查询性能,也可以正常利用日期索引 - 注意
new Date("2022-01-28")默认是UTC时间的0点,如果你的业务有时区要求,需要在$dateFromString里加上timezone参数指定时区,避免日期匹配偏差
内容的提问来源于stack exchange,提问作者ankit
相关产品推荐
相关产品推荐

