17

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

作为我的一个文档模式的一部分,我有一个“时间戳”字段。它在模式中的行是: timestamp: { type: Date, default: Date.now }

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

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

我不介意这一点,但我按原样将其发送给客户。这意味着我必须在客户端使用 Date.parse() 才能与之进行比较操作。

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

有什么理由我应该保持原样,并在客户端处理它吗?

提前致谢。

4

5 回答 5

17

您可以在架构上添加数字毫秒版本timestamp作为虚拟属性:

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

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

var schema = new Schema({
  timestamp: Date
}, {
  toObject: { getters: true }
});
于 2013-04-05T13:01:34.760 回答
6
var schema = new Schema({
  timestamp: {type:Number, default: new Date().getTime()}
});

希望这能解决您的问题。

于 2017-04-01T12:13:41.007 回答
3

作为最佳实践,我会说:保持你的数据是它应得的类型

无论如何,如果您的客户端需要处理数字,您可以简单地将日期以毫秒为单位传递给客户端,并且仍然可以在 Node.js 中使用 Date 对象。

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

于 2013-04-05T11:16:23.000 回答
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
}
于 2013-05-05T10:41:11.860 回答
2

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

myfield{
    type: Number,
    default: Date.now()
}
于 2019-04-19T03:33:02.933 回答