Mongoose按日期查询无结果问题排查
嘿,我来帮你排查下这个问题~虽然你没贴出数据库里的示例对象,但我可以基于常见的Mongoose日期处理问题给你分析几个可能的原因:
数据库字段类型定义不匹配
首先要确认你Schema里的lastTimes字段是不是定义成了Date类型。如果Schema里写成了String或者其他类型,Mongoose不会自动把存储的内容转换成Date对象,这时候调用.toDate()就会出错或者返回不符合预期的结果。正确的Schema定义应该是这样:const yourSchema = new mongoose.Schema({ lastTimes: { type: Date, default: Date.now } });要是之前数据库里存的是字符串格式的日期,你可能需要先批量把数据转换成Date类型,或者查询时手动转换:
new Date(lastTimes).toISOString()(但更推荐直接用Date类型存储)。自定义序列化逻辑干扰了日期转换
如果你给Schema设置了自定义的toJSON或toObject转换规则,可能会覆盖Mongoose默认的日期序列化行为。比如这样的设置就可能出问题:yourSchema.set('toJSON', { transform: function(doc, ret) { // 错误地把日期转成了普通字符串 ret.lastTimes = ret.lastTimes.toString(); return ret; } });检查下这类配置,确保
lastTimes字段保留了Date对象的属性,或者直接使用默认的序列化逻辑。UTC时间与本地时间的认知偏差
你得到的2018-01-22T09:29:38.729Z是标准UTC时间,如果数据库里的日期是按本地时间存储的(MongoDB官方建议统一存UTC时间),可能会让你误以为结果不对。可以在MongoDB Shell里直接查询:db.yourCollection.findOne().lastTimes,看看显示的Date对象对应的UTC时间和你预期的是否一致。如果是时区问题,可以用toLocaleString()转换成本地时间查看。查询结果中字段值异常
先打印下lastTimes的原始值看看:console.log(lastTimes),确认它是一个Mongoose的Date对象,而不是undefined或null。如果字段值为空,那说明你的查询条件可能有问题,没有正确匹配到目标文档。
内容的提问来源于stack exchange,提问作者David Faizulaev

