自加载Unix纪元以来,将mongo存储日期转换回毫秒数?

时间:2013-04-05 09:47:04

标签: node.js mongodb date mongoose

我正在使用Mongoose&我的网络服务器的Node.js。

作为我的一个文档架构的一部分,我有一个'timestamp'字段。 架构中的行是: timestamp: { type: Date, default: Date.now }

这很好用,并且允许我根据时间戳检索文档,但是,这会按照此处所述的ISODate格式保存:http://docs.mongodb.org/manual/core/document/#date,如下所示:

"timestamp":"2013-04-04T19:31:38.514Z"

我不介意这个,但我把它发送给客户端。这意味着我必须在客户端使用Date.parse()才能进行比较操作。

有没有办法将日期存储为整数,或者在检索时自动将其转换为1?

我有什么理由保留它是怎么回事,只是在客户端处理它?<​​/ p>

提前致谢。

5 个答案:

答案 0 :(得分:16)

您可以在模式中添加timestamp的数字毫秒版本作为virtual属性:

schema.virtual('timestamp_ms').get(function() {
  return this.timestamp.getTime();
});

然后,您可以通过模式上的选项在模型实例的toObject调用中启用虚拟字段:

var schema = new Schema({
  timestamp: Date
}, {
  toObject: { getters: true }
});

答案 1 :(得分:6)

var schema = new Schema({
  timestamp: {type:Number, default: new Date().getTime()}
});

希望这能解决您的问题。

答案 2 :(得分:3)

作为最佳做法,我会说:保持您的数据应有的类型

无论如何,如果您的客户需要处理数字,您只需将日期作为毫秒传递给客户端,并仍然可以使用Node中的Date对象。

只需致电timestamp.getTime()和ta-da,就可以为客户端准备好unix时间戳。

答案 3 :(得分:3)

这对我来说很好用

db.eurusd.ticks.findOne({_id:ObjectId("518636777055000000000000")}).t.getTime()

以毫秒为单位返回时间,返回的文档具有结构

{
 "_id" : ObjectId("518636777055000000000000"),
 "t" : ISODate("2013-05-05T10:37:43Z"), // date data type
 "ask" : "Joe",
 "bid" : 33
}

答案 4 :(得分:0)

当您将猫鼬类型设置为“ Date”时,猫鼬会将时间戳转换为UTC,因为时间戳是数字,而不是日期。那么如果要存储时间戳,则应将猫鼬类型设置为“数字”。

myfield{
    type: Number,
    default: Date.now()
}