【问题标题】:Get Timestamp respresenting now (current time) for querying mongodb oplog获取表示现在(当前时间)的时间戳以查询 mongodb oplog
【发布时间】:2018-03-18 14:20:45
【问题描述】:

oplog有一个字段叫ts,长这样:

{"ts":"6533707677506207745","t":2,"h":"-7325657776689654694", ...}

我想查询oplog,像这样:

db.oplog.rs.find({ts:{$gt:x}});

如何生成代表现在的时间戳?现在之前 30 秒怎么样?

如果我这样做:

const x = new Timestamp();

我收到一条错误消息:

生成时间戳的正确方法是什么?如何查询具有正确 ts 值的 oplog?

以下是时间戳的文档: http://mongodb.github.io/node-mongodb-native/core/api/Timestamp.html

但我无法弄清楚低数字/高数字是什么。

【问题讨论】:

    标签: node.js mongodb bson mongodb-oplog


    【解决方案1】:

    时间戳是 UNIX 纪元的秒数​​,而 Date() 是毫秒。所以...

    db.oplog.rs.find({ts:{$gt:Timestamp((new Date().getTime()-30000)/1000,0)}})
    

    我们在这里所做的是获取 30000 毫秒前的当前时间,将其除以 1000 以获取秒数,然后将(需要的)第二个参数添加到 Timestamp -function。

    编辑: 当然,如果您需要确切的 Timestamp() 值,则将 (new Date().getTime()-30000)/1000 的小数部分填充为第二个参数。

    var x=(new Date().getTime()-30000)/1000;
    var y=Math.floor(x);
    var z=Math.round((x-y)*1000);
    db.oplog.rs.find({ts:{$gt:Timestamp(y,z)}})
    

    【讨论】:

    • 谢谢,时间戳的第一个和第二个参数是什么? (低位和高位对吗?)...你能再解释一下吗?我不明白。
    • 是的,它是 Timestamp(,),所以实际上,在除以 1000 之后,您可以将小数部分作为第二个参数放在那里。我使用了零,因此列出了 之后的每个事件。
    【解决方案2】:

    这似乎产生了当前时间,但坦率地说我不知道​​为什么:

    import {Timestamp} from 'bson';
    const t = new Timestamp(1, Math.ceil(Date.now()/1000));
    

    该值可用于查询数据库中具有时间戳字段的字段,如下所示:

    query.ts = {$gt: t};
    const q = coll.find(query);
    

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2017-08-07
      • 2021-12-04
      • 2012-03-04
      • 2013-03-10
      • 1970-01-01
      • 2011-12-26
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多