【问题标题】:ISODate is not definedISODate 未定义
【发布时间】:2012-02-09 12:33:29
【问题描述】:

我正在尝试使用 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 is not defined

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

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

    【讨论】:

    • 它没有。它创建一个字符串。
    • 答案是正确的。包含示例的更详细答案:stackoverflow.com/a/21286896/275183
    • MongoDB 会将您的日期实例解析并存储为 ISODate("ISOstring")。但是当你再次调用所说的日期时,它将作为日期实例返回,我不想相信它,直到我自己测试它。
    • @EvanZamir 您必须在模型文件中将类型设置为“日期时间”。驱动程序将自己关心转换。
    【解决方案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); 
    });
    

    【讨论】:

      【解决方案3】:

      就我而言,我正在使用 ISODates 转换查询

      let dateString = "2014-01-22T14:56:59.301Z";
      
      $gte : ISODate(dateStr)
      

      在 node.js 中是

      $gte : new Date(dateStr)
      

      【讨论】:

        【解决方案4】:

        使用“new Date”代替ISO,节点js会自己处理ISO,无需编写ISO,只需使用“new Date”即可

        【讨论】:

          【解决方案5】:

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

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

          您可以通过将年份在 0 到 9999 之间的 ISO-8601 日期字符串传递给 new Date() 构造函数或 ISODate() 函数来指定特定日期。这些函数接受以下格式:

          • new Date("<YYYY-mm-dd>") 返回具有指定日期的 ISODate。
          • new Date("<YYYY-mm-ddTHH:MM:ss>") 指定客户端本地时区的日期时间,并返回具有指定日期时间的 ISODate UTC。
          • 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);
              })
            })
          

          【讨论】:

            【解决方案6】:
             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 {
            

            【讨论】:

              猜你喜欢
              • 2017-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-21
              • 1970-01-01
              • 1970-01-01
              • 2018-09-08
              相关资源
              最近更新 更多