MongoDB时间戳比较查询无结果,请求排查过滤条件问题
MongoDB查询返回空结果的条件排查
问题背景
需要查询满足以下条件的MongoDB文档:
updatedAt和item.lastItemDate均为毫秒级时间戳(如1681465291088)格式的数字updatedAt字段值晚于item.lastItemDateupdatedAt早于一小时前的时间且不等于0
但执行以下代码后始终返回空结果:
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000); const Tasks = await ITasks.find({ project: item.project, $and: [ { updatedAt: { $ne: 0 } }, { updatedAt: { $gt: new Date(item.lastItemDate) } }, { updatedAt: { $lt: oneHourAgo } } ] }).exec();
问题原因
核心问题是时间类型不匹配导致比较逻辑失效:
- 数据库中
updatedAt是数字类型的毫秒时间戳,但代码里将item.lastItemDate转为Date对象、oneHourAgo直接是Date对象,MongoDB会把Date对象解析为ISODate类型存储/比较。 - 数字类型和ISODate类型在MongoDB中无法直接正确比较,导致
$gt和$lt条件永远无法满足,最终返回空结果。
修正方案
将所有时间比较统一为数字类型的毫秒时间戳,同时可以合并updatedAt的过滤条件(同一字段的多条件默认是逻辑与,无需额外$and):
const oneHourAgo = Date.now() - 60 * 60 * 1000; // 直接生成数字类型的一小时前时间戳 const Tasks = await ITasks.find({ project: item.project, updatedAt: { $ne: 0, $gt: item.lastItemDate, // 直接使用原始数字时间戳 $lt: oneHourAgo // 用数字类型进行比较 } }).exec();
补充说明
MongoDB不会自动转换数字和Date类型进行比较,必须保证过滤条件中的值与数据库字段类型完全一致,才能得到正确的匹配结果。
内容的提问来源于stack exchange,提问作者Arsene Wenger
相关产品推荐
相关产品推荐

