ISODate未定义。

57

我正在尝试使用nodejs/mongoose从mongodb获取结果。

var dateStr = new Date(year,month,day,0,0,0);
var nextDate = new Date(year,month,day,23,59,59);

GPSData.find({"createdAt" : { $gte : new ISODate(dateStr), $lte:  new ISODate(nextDate) }}, function(err, data) {
  if(err)
    console.log(err); 
});

错误: ISODate未定义

6个回答

85
请注意,ISODate 是 MongoDB 的一部分,因此在您的情况下不可用。相反,您应该使用 Date,MongoDB 驱动程序(例如您当前正在使用的 Mongoose ORM)将在幕后处理 DateISODate 之间的类型转换。

13
它并不会这样做。它会创建一个字符串。 - Evan Zamir
2
答案是正确的。更详细的答案包含示例:https://dev59.com/eWEi5IYBdhLWcg3wbr3S#21286896 - h-kippo
MongoDB会将您的日期实例解析并存储为ISODate("ISOstring")。但是,当您再次调用该日期时,它将作为日期实例返回。我不想相信它,直到我亲自测试了它。 - WouldBeNerd
1
@EvanZamir 你需要在你的模型文件中将类型设置为 'datetime'。驱动程序会自行处理转换。 - 1nstinct

22

在我的情况下,我正在转换一个带有ISO日期的查询

let dateString = "2014-01-22T14:56:59.301Z";

$gte : ISODate( dateString )

在node.js中

$gte : new Date( dateString )

1
这是正确的答案!我测试过了,它像魔法一样运行。 - A.T Rayan

4

不要使用ISO,而是使用"new Date"。Node.js会自行处理ISO格式,因此无需编写ISO,只需使用"new Date"即可。


4

使用Moment JS在JavaScript中将日期转换为MongoDB ISODate格式

MongoDB使用ISODate作为其主要日期类型。如果您想将日期对象插入MongoDB集合中,可以使用 Date() shell方法。

您可以通过向 new Date() 构造函数或 ISODate() 函数传递包含年份的 ISO-8601 日期字符串来指定特定日期。这些函数接受以下格式:

  • new Date("<YYYY-mm-dd>") 返回指定日期的 ISODate。
  • new Date("<YYYY-mm-ddTHH:MM:ss>") 指定客户端本地时区的日期时间,并返回具有指定 UTC 日期时间的 ISODate。
  • new Date("<YYYY-mm-ddTHH:MM:ssZ>") 指定 UTC 的日期时间,并返回具有指定 UTC 日期时间的 ISODate。
  • new Date() 将日期时间指定为 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数,并返回生成的 ISODate 实例。

如果您正在使用 JavaScript 编写代码并希望传递 JavaScript 日期对象并与 MongoDB 客户端一起使用,则首先要做的是将 JavaScript 日期转换为 MongoDB 日期格式(ISODate)。以下是如何操作。

    var today = moment(new Date()).format('YYYY-MM-DD[T00:00:00.000Z]');
    console.log("Next day -- " + (reqDate.getDate() + 1))
    var d = new Date();
    d.setDate(reqDate.getDate() + 1);
    var tomorrow = moment(d).format('YYYY-MM-DD[T00:00:00.000Z]');

使用新的Date() shell方法,您可以将今天和明天的对象传递给MongoDB查询。

  MongoClient.connect(con, function (err, db) {
    if (err) throw err
    db.collection('orders').find({ "order_id": store_id, "orderDate": {     
       "$gte": new Date(today), "$lt": new Date(tomorrow)}
     }).toArray(function (err, result) {
        console.log(result);
        if (err) throw err
          res.send(result);
    })
  })

2
您可以按照以下方式使用,将日期转换为ISO字符串:
GPSData.find({"createdAt" : { $gte : new Date(year,month,day,0,0,0).toISOString(), $lte:  new Date(year,month,day,23,59,59).toISOString() }}, function(err, data) {
  if(err)
    console.log(err); 
});

-1
 if (req.params.sDate && req.params.eDate) {
      query["createdAt"] = {
        $gte:  new Date("2020-01-25").toISOString(),
        $lte:    new Date("2020-09-25").toISOString()
      };
    }

    console.log("query", query, req.params.limit, req.params.skip);
    domain.Payment.find(query)
      .limit(req.params.limit)
      .skip(req.params.skip)
      .sort({ createdAt: -1 })
      .exec((err, list) => {
        console.log("err", err);

        if (err || !list) {
          callback(err, null);
        } else {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接