如何根据datetime字段查询MongoDB文档?日期查询无结果如何解决
问题原因
- 你MongoDB中存储的
creationTime字段为字符串类型,并非MongoDB原生ISODate类型,直接用ISODate对象查询时,类型不匹配所以没有返回结果。 - 你提供的查询语句中使用的字段名是
date_time,和实际存储的字段名creationTime不一致,也是查询无结果的常见原因。 - Compass中直接用
$lt: "2021-09-10"能查到结果,是因为你存储的字符串格式为YYYY-MM-DD HH:MM:SS,这种格式的字符串字典排序和时间顺序完全一致,字符串比较可以得到正确的时间比较结果。
解决方案
方案一(推荐):将存储的字符串日期转换为ISODate类型
这种方式后续查询、统计、索引优化都更方便,首先备份数据后执行批量转换:
db.collection.find({}).forEach(doc => { if (typeof doc.creationTime === 'string') { // 字符串转ISODate doc.creationTime = new Date(doc.creationTime); db.collection.save(doc); } })
转换完成后,Node.js中直接传入Date对象查询即可,无需手动处理字符串格式:
const d = new Date(); d.setDate(d.getDate() - 7); // MongoDB驱动会自动将Date对象转为ISODate格式匹配查询 const res = await db.collection.find({ creationTime: { $lt: d } }).toArray();
方案二:保留现有字符串存储格式,直接用字符串查询
不需要修改存量数据,注意两点即可:
- 确保查询时使用的字段名和实际存储的
creationTime完全一致 - 用于比较的字符串和存储格式规则匹配,
YYYY-MM-DD前缀格式可直接用于范围比较
Node.js查询示例:
const d = new Date(); d.setDate(d.getDate() - 7); const queryDate = d.toISOString().substring(0, 10); const res = await db.collection.find({ creationTime: { $lt: queryDate } }).toArray();
内容的提问来源于stack exchange,提问作者PHP User
相关产品推荐
相关产品推荐

