【问题标题】:Find data from date in MongoDB在 MongoDB 中从日期中查找数据
【发布时间】:2020-02-27 09:21:41
【问题描述】:

我在 MongoDB 中有一些数据,我想查找特定日期的数据,但在 DB 中,它随时间以 ISODate() 格式存储,像这样,

{ 
"_id": ObjectId("5e578771cd0d3b7660deb7ca"),
  "updatedAt": ISODate("2020-02-27T16:38:20.444+0000"),
  "createdAt": ISODate("2020-02-27T16:38:20.444+0000")
}

但我想得到这个文档。仅使用字符串日期,例如, db.collection.find({ createdAt: "2020-02-27" });

我试图通过创建范围来做到这一点,

setFream1 = new Date(new Date("2020-02-27").setHours(0,0,0,0));
setFream2 = new Date(new Date("2020-02-27").setHours(23,59,59,999));


db.collection.find({ createdAt: { $gte: new Date(setFream1), $lte: new Date(setFream2) } });

我认为它会起作用,但是还有其他更好的方法吗? 谢谢!

【问题讨论】:

  • 更好地定义。 “2020-02-27”将被解析为 UTC,因此 new Date("2020-02-27").setHours(0,0,0,0) 很可能会根据主机时区设置生成 2020-02-26 或 2020-02-28 开始的时间值。 new Date(2020, 1, 28) 代码更少,结果可预测。

标签: javascript node.js mongodb date find


【解决方案1】:

最简单和优化的方法是为此使用moment 库。

你可以使用这个安装moment

npm i moment

然后像这样要求它:

var moment=require("moment");

然后像这样使用它:

setFream1=moment("2020-02-27 00:00:00.000").utc().format("YYYY-MM-DDTHH:mm:ss.SSS[Z]");
setFream2 =moment("2020-02-27 23:59:59.999").utc().format("YYYY-MM-DDTHH:mm:ss.SSS[Z]");

【讨论】:

  • Date 值与字符串 进行比较通常是个坏主意。
  • Moment 将字符串解析为 Date 对象。
  • 不好的地方是 .format("YYYY-MM-DDTHH:mm:ss.SSS[Z]") 创建一个字符串而不是一个 Date 对象。
【解决方案2】:

我会推荐Moment.js

db.collection.find(
   {
      createdAt: {
         $gte: moment("2020-02-27").startOf("day").toDate(),
         $lte: moment("2020-02-27").endOf("day").toDate()
      }
   }
);

【讨论】:

  • moment("2020-02-27").startOf("day").toDate() 这将输出 Thu Feb 27 2020 00:00:00 GMT+0530(印度标准时间)
  • 这取决于您的客户端设置,我得到ISODate("2020-02-26T23:00:00Z") - 但问题出在哪里?它仍然是一个有效的Date 对象,并且与createdAt 比较可以正常工作,因为它也是一个Date
  • 比较有用吗??因为我从来没有这样尝试过。请告诉我。
  • 是的,当然可以。即使您在本地时间生成moment,它也可以工作,因为比较总是基于 UTC 时间。
猜你喜欢
  • 2018-11-09
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多