【问题标题】:why does $eq comparison is not working on mongodb with dates为什么 $eq 比较不适用于带有日期的 mongodb
【发布时间】:2019-08-02 03:54:34
【问题描述】:

我有以下关于 mongo 的查询

db.getCollection('someCollection').find({"status":"failed","start_date": {$gt: new Date("2019/03/01")}})

这将检索所有状态为失败且 start_date 等于或大于“2019/03/01”的记录。

但是当我尝试只检索专门针对“2019/03/01”的记录时:

db.getCollection('someCollection').find({"status":"failed","start_date": {$eq: new Date("2019/03/01")}})

它不检索任何东西。

$lt 和 $gt 查询工作只是 $eq 不起作用。这是使用 $eq 的正确方法吗?

谢谢

【问题讨论】:

  • 在专门为“2019/03/01”检索记录的示例中,您实际上是在查找状态为失败且start_date 等于“2019/03/06”的记录
  • @Misantorp 我很糟糕,我在玩多个值时没有粘贴正确的值
  • 您要查找的确切文档是什么?日期比较也需要小时、分钟、秒和毫秒来匹配,所以这可能是您的问题
  • @kmdreko, $gt/$lt 不需要 hrs/min/secc/mil 你是说 $eq 需要吗?
  • @efx $lt/$gt 也比较它们,但由于它们在您的查询中都是零,因此不会看到效果

标签: mongodb


【解决方案1】:

当您使用new Date("2019/03/01") 时,实际搜索的日期是 2019/03/01 00:00:00.00。也就是说,日期正好是 2019/03/01 午夜(精确到毫秒)。除非您的记录也记录了完全相同的日期,否则它将不匹配。这就是为什么你需要使用{$gt: new Date("2019/03/01"), $lt: new Date("2019/03/02")}。只需将其视为 1“天”实际上是 24 小时的范围。这就是为什么您需要将其指定为范围,而不是简单的 $eq 比较。

您的第一个查询有效的原因是,当您搜索 $gt 2019/03/01 时,您实际上是在搜索 $gt 2019/03/01 00:00:00.00。因此,当然,从 2019/03/01 开始的每条记录都会匹配。

需要注意的一点:从技术上讲,如果您在午夜准确制作了一份文档,即时间戳为 2019/03/01 00:00:00.00,它将不匹配。所以你真的应该使用{$gte: new Date ('2019/03/01')}(注意额外的'e')。 $gte 大于或等于。这可能听起来微不足道,但实际上很重要,因为如果您不使用实际时间戳并仅记录创建记录时的日期(即您使用{start_date: new Date('2019/03/01')} 插入,所有这些时间戳实际上将具有 00:00:00.00 作为它们的时间组件,它们不会与 $gt 比较匹配,只有 $gte 比较。您可能在创建记录时使用 new Date(),所以您得到了完整的时间戳,这就是它没有被咬的原因你还没有。但是为了在语义上正确,你应该在你的第一个查询中使用 $gte。这有意义吗?

【讨论】:

  • 我确实按照您的建议进行了查询,我的问题更多的是关于为什么我必须使用“范围”而不是仅使用不带时间戳的日期,谢谢跨度>
猜你喜欢
  • 2017-11-11
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2020-10-05
相关资源
最近更新 更多