MongoDB中字符串格式存储的日期字段能否执行范围查询?
核心结论
- 你可以直接用这类字符串执行日期时间范围查询,无需提前转换为MongoDB原生Date类型
- 你给出的查询语句可以按照预期正常运行,能够准确筛选出2020年11月21日之后到2021年1月21日(含1月21日全天)的所有符合要求的文档
原理说明
你采用的yyyymmdd-HHmmss字符串存储格式天生满足字典序与时间先后顺序完全一致的特性:
- MongoDB字符串比较逻辑是逐位按ASCII码对比,这种格式会先对比年份位、再对比月份位、再对比日期位、最后对比时分秒位,比较结果和实际时间的先后顺序完全匹配
- 你传入的查询阈值
"20201121"、"20210121"刚好和存储的startDate字段的前8位(日期部分)对齐,所以比较逻辑完全符合你要的日期范围筛选要求
注意事项
- 该查询方式仅适用于「高位时间单位在前、低位时间单位在后」的字符串格式,若存储格式为
dd/mm/yyyy、mm-dd-yyyy这类字典序和时间序不匹配的格式,则无法得到正确结果- 若需要更细粒度的时间筛选,只需将查询阈值的格式与存储格式对齐即可,比如筛选2020年11月21日14点到2020年11月25日10点的记录,查询语句可写为:
db.test.find({ startDate:{$gt: "20201121-140000", $lte: "20201125-100000"}})
- 该方式的局限性是无法直接使用MongoDB原生日期操作符做复杂日期计算,若有类似需求可通过聚合管道的
$dateFromString操作符将字符串转为Date类型后再处理
内容的提问来源于stack exchange,提问作者giridhar gpr
相关产品推荐
相关产品推荐

