2016-07-28 10 views
1

Ich weiß, dass wir getTimestamp() verwenden können, um den Zeitstempel von der ObjectId abzurufen, aber gibt es eine Möglichkeit, eine ObjectId aus einem Zeitstempel zu generieren?Wie konvertiert man von Timestamp in Mongo ObjectID

Genauer gesagt, wenn ich eine Eingabe von Monat haben und Jahr, dann will ich es in Mongo ObjectID konvertieren in db abzufragen, wie soll ich das tun?

+0

Mögliches Duplikat von [Mongodb: Führen Sie eine Datumsbereichsabfrage von der ObjectId in der Mongo-Shell aus] (https://stackoverflow.com/questions/13593896/mongodb-perform-a-date-range-query-from-the -objectid-in-the-mongo-shell) –

+0

Nein, das ist eine andere Antwort, das ist, wenn wir einen Zeitstempel in objectID konvertieren möchten, wo die Objekt-ID ein bestimmtes Datum/Uhrzeit enthalten soll, nicht unbedingt das aktuelle Datum –

Antwort

0

Ich habe eine Lösung dafür gefunden und es funktioniert gut sofar.

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); 
} 
0

Ein ObjectId() ist ein 12-Byte-BSON Typ und besteht aus:

  • Die ersten 4 Bytes der Sekunden seit der Epoche UNIX- darstellt
  • Die nächsten 3 Bytes, die die Maschinenkennung
  • Das nächste sind 2 Byte besteht aus Prozess-ID
  • Die letzten 3 Bytes sind ein Zufallszählerwert

Offensichtlich , Sie können ObjectId() nicht nur aus dem Zeitstempel erstellen.

0

Ja, Sie können:

dummy_id = ObjectId.from_datetime(gen_time) 

Wo gen_time Date.

0

dies versuchen,

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

Werke von Mongo Shell.