Mongoose:更新文档时,转换为日期失败

时间:2014-11-09 11:17:14

标签: javascript node.js mongodb mongoose

我在我的项目中使用Mongoose,并在其中一个模式中使用Date字段,如下所示:

reservationDay: {
        type: Date,
        default: Date.now
}

我可以使用此字段创建文档而不会出现问题。当我在创建它之后的console.log时,我得到:

reservationDay:  Thu Nov 20 2014 04:45:00 GMT+0100 (CET)

但是,当我尝试更新此文档时出现问题(即使不更改reservationDay字段)。这是我收到的错误消息:

name: 'CastError',
  message: 'Cast to date failed for value "20/11/2014 04:11" at path "reservationDay"' } CastError: Cast to date failed for value "20/11/2014 04:11" at path "reservationDay"

以下是我在服务器端更新此文档的方法:

Reservation.findOne({ _id: id }).exec(function(err, reservation) {
                        if (err) {
                            //handle
                        }
                        if (!reservation) {
                            //handle
                        }
                        reservation = extend(reservation, req.body);
                        reservation.save(function(err, updatedReservation) {
                            if (err) {
                                //handle
                            }
                            return res.json(reservation);
                        });
                    });

并且req.body中的日期没有改变。

任何可能导致此错误的想法?

谢谢!

3 个答案:

答案 0 :(得分:9)

"20/11/2014 04:11"是无效的ISODate格式。您正在某处将reservationDate转换为无效格式的字符串。您需要将其转换为有效的ISODate格式(前一天):

new Date("11/20/2014 04:11") // Thu Nov 20 2014 04:11:00 GMT+0100 (CET)
new Date("2014/11/20 04:11") // Thu Nov 20 2014 04:11:00 GMT+0100 (CET)
new Date("20/11/2014 04:11") // Invalid Date

为了便于操作日期格式,我建议使用moment.js

答案 1 :(得分:1)

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

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

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

  • 新日期("<YYYY-mm-dd>"返回具有指定日期的ISODate。
  • 新日期("<YYYY-mm-ddTHH:MM:ss>"在客户的本地时区中指定日期时间,并以UTC返回具有指定日期时间的ISODate。
  • 新日期("<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 :(得分:0)

我想从我的错误中更新一点。

检查您是否在单位时间内错过了前导零。

“ 2017-01-01T8:00:00”无效,并且会出现上述错误。

“ 2017-01-01T08:00:00”有效