我在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) }
转换为纪元时间或等时间?
这个时间戳的格式是什么?
答案 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类型。