如何在没有时间的情况下比较 mongo 上的日期?

Vũ *_*ũng 3 mongodb mongodb-query

这是样本数据

[{ date: '2020-05-21T14:02:00.0123 }, { date: '2020-05-22T14:02:00.0123 }, { date: '2020-05-23T14:02:00.0123 }]
Run Code Online (Sandbox Code Playgroud)

我想过滤 5 月 22 日或更早的记录,这是我的预期:

[{ date: '2020-05-21T14:02:00.0123 }, { date: '2020-05-22T14:02:00.0123 }]
Run Code Online (Sandbox Code Playgroud)

我尝试过这个查询:

{ date: { $lte: new Date('2020-05-22') }}
Run Code Online (Sandbox Code Playgroud)

但它仅返回 5 月 22 日之前的数据。我认为问题是{ date: { $lte: new Date('2020-05-22') }}data.date lte 2020-05-22T00:00:00.000

我如何排除时间?

sri*_*asy 5

您需要将输入类型与date文档中的字段类型相匹配,两者都应该是Date\'s 或strings。我强烈建议将日期保留为数据库中的日期。您还需要知道 MongoDB 中的日期是有格式的ISODate()并且保存UTC日期。

\n\n
    \n
  1. 如果您的数据库date字段的类型为date
  2. \n
\n\n
\n

我想过滤 5 月 22 日或更早的记录

\n
\n\n

由于您想要获取<= 22-May 的文档,因此发送new Date(\'2020-05-22\')不起作用。原因 :

\n\n

当您这样做时,只有当您属于 时,new Date(\'2020-05-22\')它才会给您,例如,如果您在美国纽约,比 UTC 晚 4 小时,那么它会导致代表 EDT,基本上它是您的系统/应用程序服务器时间即;本地日期时间。Fri May 22 2020 00:00:00 GMTUTCThu May 21 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

\n\n

因此,如果您所在的地区落后UTC,那么您将得到一个回溯日期,Thu May 21 2020否则如果它领先UTC,那么您将不会看到任何问题Fri May 22 2020

\n\n

好的,现在我们已经解决了日期问题,但我们现在需要研究时间:

\n\n

由于您想要 docs <= 22-May那么Fri May 22 2020 00:00:00 GMT不起作用,您需要有<= Fri May 22 2020 23:59:59 GMTSat May 23 2020 00:00:00 GMT。为了得到这个:

\n\n
let date = new Date(\'2020-05-22\')\ndate.setDate(date.getUTCDate()); // Setting utc date, Only useful if you\'re region is behind UTC\ndate = new Date(date.setHours(23,59,59,999)) // This overrides hours generated with 23:59:59 - which is what exactly needed here.\n\n/** Now do your query */\n\n{ date: { $lte: date }}\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 如果您的数据库date字段的类型为string
  2. \n
\n\n

那么您不需要将字符串转换为日期,而是可以以字符串格式发送输入日期:

\n\n
let date = new Date(\'2020-05-22\').toISOString() // 2020-05-22T00:00:00.000Z\n/** Above would get you an ISO string no matter which region you\'re in,\xe2\x80\x88\n  * now since we need `2020-05-22T23:59:59.000Z` which is not easy on ISO string\n  * We would just do +1 on date like `new Date(\'2020-05-23\').toISOString()` - // 2020-05-23T00:00:00.000Z */\n\nlet date = new Date(\'2020-05-23\').toISOString(); // like this\ndate = date.slice(0, -1) // removing `Z` from date string as your `date` field doesn\'t have this.\n// Now your query is just `$lt`\n{ date: { $lt: date }}\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试: mongoplayground

\n