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

能否无需输入查询数据,查询MongoDB文档中时间在dispatchTime与disposalTime间的记录?

技术指导:查询当前时间处于派单与完成时间之间的MongoDB记录

问题分析

你当前的查询逻辑完全反转了,导致无法得到预期结果。你要找的是当前时间落在dispatchTime(派单时间)和disposalTime(处理完成时间)之间的记录,正确的逻辑应该是:

  • 派单时间 ≤ 当前时间(dispatchTime 不能晚于现在)
  • 当前时间 ≤ 处理完成时间(disposalTime 不能早于现在)

而你写的条件是disposalTime ≤ 当前时间且dispatchTime ≥ 当前时间,这相当于找派单时间在现在之后、完成时间在现在之前的记录,显然不符合需求。

正确查询写法

情况1:字段为Date类型(推荐)

如果dispatchTime和disposalTime在MongoDB中存储为Date类型(而非字符串),直接用以下简洁写法即可(MongoDB默认支持多条件逻辑与,无需显式写$and):

await Product.find({
  dispatchTime: { $lte: new Date() },
  disposalTime: { $gte: new Date() }
})
  • 直接使用new Date()即可,MongoDB会自动处理为对应的ISODate类型,无需转成ISO字符串(转字符串反而可能引入时区或格式问题)。

情况2:字段为字符串类型

如果字段存储的是时间字符串(如"2024-05-20T12:00:00Z"),需要先将字符串转为Date类型再比较,用$expr实现:

await Product.find({
  $expr: {
    $and: [
      { $lte: [{ $toDate: "$dispatchTime" }, new Date()] },
      { $gte: [{ $toDate: "$disposalTime" }, new Date()] }
    ]
  }
})

注意:字符串转Date会降低查询效率,建议后续将字段类型改为Date,同时可以给dispatchTime和disposalTime创建复合索引,进一步提升查询性能。

额外优化建议

  • 若需统一使用UTC时间,可替换new Date()为new Date(Date.now()),确保时间比较的一致性。
  • 测试时可以手动构造测试数据,验证查询结果是否符合预期,比如插入一条dispatchTime为昨天、disposalTime为明天的记录,看是否能被查询到。

内容的提问来源于stack exchange,提问作者Falconthaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:06:45