【问题标题】:Unknown timestamp format output by MongooseMongoose 输出的未知时间戳格式
【发布时间】:2016-03-10 11:45:42
【问题描述】:

我正在使用 node.js 中的 mongoose 查询 Oplog,以使用以下代码获取最后一条 oplog 记录的时间戳:

oplogModel.find().sort('-ts').limit(1).select('ts').exec(function(err, res){
    if (err) {console.log(err);}
    lastTimestamp=res[0];
    console.log(JSON.stringify(lastTimestamp));
});

但我得到的输出是{"ts":"6260013777081597954"}

当我在 mongo shell 中运行它时,

rs0:PRIMARY> db.oplog.rs.find({}, {ts:1, _id:0}).sort({ts:-1}).limit(1);

我明白了:{ "ts" : Timestamp(1457523037, 2) }

如何将{"ts":"6260013777081597954"} 转换为纪元时间或iso 时间? 这个时间戳是什么格式的?

【问题讨论】:

  • documentation 应该在这里提供帮助。
  • 这里出了点问题。使用 bson-timestamp 库将您在 Mongo 中获得的时间戳转换为整数会得到完全不同的结果

标签: node.js mongodb datetime mongoose timestamp


【解决方案1】:

您得到的输出是因为console.log(JSON.stringify(lastTimestamp)) 行,因为JSON.stringify(lastTimestamp) 将结果对象解析为字符串。

本质上你需要将时间戳转换为 32 位 int:

oplogModel.find().sort('-ts').limit(1).select('ts').exec(function(err, res){
    if (err) {console.log(err);}
    lastTimestamp=res[0].ts;
    console.log(lastTimestamp); // 6260013777081597954

    var h = 4294967296, // 2^32
        timestamp = Math.floor(lastTimestamp / 4294967296), // convert to 32-bit int
        date = new Date(timestamp * 1000); // Date() expects milliseconds.

    console.log(date);
});

当你在 mongo shell 中得到{ "ts" : Timestamp(1457523037, 2) } 时,第一个参数表示一个 32 位值,表示自 unix 纪元以来的秒数,第二个参数是 32 位序数值,用于对同一秒内发生的操作进行排序。

有关更多详细信息,请参阅documentation,但请记住,BSON 时间戳类型供 MongoDB 内部使用,在您自己的数据中,您应该更喜欢 Date 类型。

【讨论】:

  • 我正在查询 oplog 这是一个内部只读集合,因此我无法选择它的日期时间。
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2017-01-22
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多