【问题标题】:Filter Data between two String过滤两个字符串之间的数据
【发布时间】:2021-01-17 23:12:20
【问题描述】:

我有一个文档的创建日期属性,其格式如下:字符串类型的“05/03/2020”。

我必须从我的系统中提取创建日期早于“05/03/2020”的所有文档。

我试过了:

db.MyCollection.find ({DateC: {$lte: "05/03/2020"}})

但它仍然返回 0。

有没有办法比较日期格式字符串是否在另一个日期之前?

谢谢

【问题讨论】:

  • 我建议您找出必须使用哪种格式来查询您的数据库。然后,将输入格式映射到 DB 格式。 05/03/2020 不太可能准备好在查询中使用。要执行日期格式,您可以使用 moment.js,这是一个非常好的处理日期的库。
  • 看看这个:stackoverflow.com/a/8835850/5860648 我认为这是如何根据日期查询的一个很好的例子。然后,如果您的输入格式不正确,请按您需要的方式进行格式化:)
  • 是的,但我有超过 3000 个格式为“01/12/2020”的文档,所以我无法全部更新。
  • 问题是我系统中的格式是字符串而不是日期,所以这个例子对我没有帮助
  • 将日期存储为字符串不是一个好习惯,因为您将无法进一步使用日期比较运算符。如果我是你,我可能会首先计划迁移以首先修复数据库中的数据。否则,您将不得不在内存中获取整个数据库以以编程方式执行检查,这是您不想要的。计划迁移并修复您的数据库数据,以便以后正确使用它!

标签: javascript node.js mongoose mongodb-atlas


【解决方案1】:

您可以使用$dateFromString 运算符将$DateC 转换为ISODate,

  • 确保您的输入应采用 ISODate 格式,
db.MyCollection.find([
  {
    $expr: {
      $lte: [
        {
          $dateFromString: {
            dateString: "$DateC",
            format: "%d/%m/%Y"
          }
        },
        ISODate("2020-03-05T00:00:00.000Z")
      ]
    }
  }
])

Playground

我不确定你的日期格式,我预测为d/m/y,如果不同,你可以自己管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多