MongoDB指定日期执行dump或deleteMany时查询无结果问题咨询
MongoDB按时间范围查询无结果问题解决方案
问题根因
你查询不到数据的核心原因是集合中addTime字段存储的是字符串格式,而非MongoDB原生Date类型,直接用Date类型对象和字符串做比较,类型不匹配导致条件始终不成立。同时注意你语句中的collections是MongoDB的内置方法名,需要替换为你实际要操作的集合名称。
验证查询解决方案
方案1:不修改字段类型直接查询
你当前使用的YYYY-MM-DD HH:mm:ss时间字符串格式的字典序与时间顺序完全一致,可直接用字符串做比较:
// 查询2021年9月1日及之前的数据 db.你的实际集合名.find({ addTime: {$lte: "2021-09-01"} }) // 如果要查询2021年8月之前(不含8月)的数据,把条件值改为"2021-08-01"即可
方案2:先转换字段类型为Date(推荐长期使用)
将时间字段转换为原生Date类型后,后续的查询、聚合、索引性能都会更高,转换脚本如下:
// 建议先对少量数据测试验证后再全量执行 db.你的实际集合名.find().forEach(doc => { doc.addTime = new Date(doc.addTime); doc.editTime = new Date(doc.editTime); db.你的实际集合名.save(doc); })
转换完成后你原本的查询语句即可正常返回结果。
数据导出语法
如果需要导出符合条件的数据,可使用mongoexport工具执行对应命令:
- 字段为字符串类型时的导出命令:
mongoexport --db 你的实际数据库名 --collection 你的实际集合名 --query '{"addTime": {"$lte": "2021-09-01"}}' --out ./导出的文件路径.json
- 字段已转换为Date类型时的导出命令:
mongoexport --db 你的实际数据库名 --collection 你的实际集合名 --query '{"addTime": {"$lte": {"$date": "2021-09-01T00:00:00Z"}}}' --out ./导出的文件路径.json
内容的提问来源于stack exchange,提问作者empoy
相关产品推荐
相关产品推荐

