Crea ObjectID MongoDB dalla data del passato usando il driver PHP

Devo importre un sacco di dati in MongoDB da MySQL e vorrei usare il timestamp dall'ObjectID invece di memorizzarlo in una chiave / valore separato (come nei dati esistenti). Per fare questo ho bisogno di creare un ObjectID per i dati esistenti con una data del passato. Devo anche farlo usando il driver PHP. Ho letto che potrebbe esserci un modo per farlo in Python, Java e Node.JS quindi ho pensato che forse c'era un metodo equivalente in PHP.

Se questo è ansible, è sicuro farlo? Significato e ho intenzione di avere problemi con ObjectIDs duplicati o non validi? Grazie.

In Node.JS:

var timestamp = Math.floor(new Date().getTime()/1000); var objectId = new ObjectID(timestamp); 

Di seguito viene riportto: MongoDB utilizzando timestamp per ordinare

In Python:

 gen_time = datetime.datetime(2010, 1, 1) dummy_id = ObjectId.from_datetime(gen_time) 

In Java:

 Date d = new Date(some timestamp in ms); ObjectId id = new ObjectId(d) 

In questo momento, il driver PHP non ha funzionalità incorporate per questo, il __set_state () che l'altra risposta menzionata è solo per essere in grado di deserializzare la session dell'ID e non consente di crearlo attraverso i componenti specifici.

Dovrai fare quanto segue per creare automaticamente un ID:

 <?php function createId( $yourTimestamp ) { static $inc = 0; $ts = pack( 'N', $yourTimestamp ); $m = substr( md5( gethostname()), 0, 3 ); $pid = pack( 'n', posix_getpid() ); $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); } var_dump( createId( time() ) ); ?> 

Se stai usando MongoId solo per il confronto, ad esempio, selezionando tutti i record all'interno di un intervallo di date, non hai bisogno di un ID pienamente valido. Quindi potresti semplicemente fare:

 $id = new \MongoId(dechex($timestamp) . str_repeat("0", 16)); 

Assicurati di non inserire mai questo id e usalo solo per $ gte / $ gt / $ lt / $ lte queries.

modificare

Il mio male, il frammento di cui sopra functionrebbe con le date precedenti al 1979, dato che il dechex($timestamp) non restituisce sempre 8 caratteri, quindi uno snippet migliore sarebbe:

 $id = new \MongoId(sprintf("%08x%016x", $timestamp, 0)); 

Ciò potrebbe creare problemi poiché uno dei fattori che rende l'objectid univoco è la parte del tempo, tuttavia dovrebbe incrementare l'ultimo byte (o così) su più inserti con la stessa ora.

Sembra che ci sia stato un certo movimento verso la creazione di un ObjectId con alcuni parametri e in pratica si parla quasi di questo qui: http://php.net/manual/en/mongoid.set-state.php

Teoricamente, una serie di properties; utilizzate per creare il nuovo id. Tuttavia, poiché le istanze MongoId non hanno properties;, questa non viene utilizzata.

Comunque non c'è modo, atm, credo di get ciò che si può fare in altre lingue senza scrivere il proprio generatore ObjectId .