能否无需输入查询数据,查询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
相关产品推荐
相关产品推荐

