我知道我们可以使用getTimestamp()
从ObjectId中检索时间戳,但有没有办法从时间戳生成ObjectId?
更具体地说,如果我输入月和年,那么我想将其转换为 Mongo ObjectID 以在db中查询,我该怎么做?
答案 0 :(得分:0)
ObjectId()
是12字节的BSON类型,包括:
显然,您将无法仅从时间戳创建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)