Mongoose输出的未知时间戳格式

时间:2016-03-10 11:45:43

标签: node.js mongodb datetime mongoose timestamp

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

a.first - b.first

但我得到的输出是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)); });

当我在mongo shell中运行时,

{"ts":"6260013777081597954"}

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

如何将{ "ts" : Timestamp(1457523037, 2) }转换为纪元时间或等时间? 这个时间戳的格式是什么?

1 个答案:

答案 0 :(得分: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类型。