如何转换Timestamp到Mongo ObjectID

时间:2016-07-28 07:34:37

标签: mongodb timestamp

我知道我们可以使用getTimestamp()从ObjectId中检索时间戳,但有没有办法从时间戳生成ObjectId?

更具体地说,如果我输入,那么我想将其转换为 Mongo ObjectID 以在db中查询,我该怎么做?

5 个答案:

答案 0 :(得分:0)

ObjectId()是12字节的BSON类型,包括:

  • 前4个字节代表自unix时代以来的秒数
  • 接下来的3个字节是机器标识符
  • 接下来的2个字节由进程ID
  • 组成
  • 最后3个字节是随机计数器值

显然,您将无法仅从时间戳创建ObjectId()

答案 1 :(得分:0)

我已经为此找到了解决方案,并且运行良好。

 public function createMongoIdFromTimestamp($timestamp) {
    $inc = 0;
    $ts = pack('N', $timestamp);
    $m = substr(md5(gethostname()), 0, 3);
    $pid = pack('n', getmypid());
    $trail = substr(pack('N', $inc++), 1, 3);

    $bin = sprintf('%s%s%s%s', $ts, $m, $pid, $trail);

    $id = '';
    for ($i = 0; $i < 12; $i++) {
        $id .= sprintf('%02X', ord($bin[$i]));
    }
    return new \MongoID($id);
}

答案 2 :(得分:0)

是的,你可以:

dummy_id = ObjectId.from_datetime(gen_time)

gen_time是datetime。

答案 3 :(得分:0)

试试这个,

> ObjectId("5a682326bf8380e6e6584ba5").getTimestamp()
ISODate("2018-01-24T06:09:42Z")
> ObjectId.fromDate(ISODate("2018-01-24T06:09:42Z"))
ObjectId("5a6823260000000000000000")

来自mongo shell。

答案 4 :(得分:0)

如果将数字传递给bson ObjectId构造函数,它将把它作为时间戳记并传递给generate方法。

您可以从this answer中的月份和年份中获取日期(月份从零开始)。

所以:

timestamp = ~~(new Date(2016, 11, 17) / 1000)
new ObjectId(timestamp)