You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB时间戳比较查询无结果,请求排查过滤条件问题

MongoDB查询返回空结果的条件排查

问题背景

需要查询满足以下条件的MongoDB文档:

  • updatedAt和item.lastItemDate均为毫秒级时间戳(如1681465291088)格式的数字
  • updatedAt字段值晚于item.lastItemDate
  • updatedAt早于一小时前的时间且不等于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:30:07