2012-03-19 14 views
5

Siendo relativamente nuevo en mongo, leí en el manual de mongo sobre la optimización de ID de objeto.Consulta de intervalo de fechas de Mongo utilizando _id en PHP

http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield.

Ir con la recomendación de no crear un campo created_on separada, decidí que posteriormente extraer la fecha del campo _id que es un ObjectID

Ahora, tengo muchos registros de todos con un campo created_on.

que estoy tratando de consulta para un rango de fechas, pero estoy seguro de la sintaxis:

$start = new MongoDate(strtotime("2012-03-01 00:00:00")); 
$end = new MongoDate(strtotime("2012-03-15 00:00:00")); 

$collection->find(array('_id' => array('$gt' => $start, '$lte' => $end))); 

devuelve siempre 0 resultados. Aunque puedo consultar registros individuales y extraer la fecha del objeto.

Respuesta

12

En PHP, es necesario hacer algo como:

function timeToId($ts) { 
    // turn it into hex 
    $hexTs = dechex($ts); 
    // pad it out to 8 chars 
    $hexTs = str_pad($hexTs, 8, "0", STR_PAD_LEFT); 
    // make an _id from it 
    return new MongoId($hexTs."0000000000000000"); 
} 

$start = strtotime("2012-03-01 00:00:00"); 
$end = strtotime("2012-03-15 00:00:00"); 

$collection->find(array('_id' => array('$gt' => timeToId($start), '$lte' => timeToId($end)))); 

A continuación, puede utilizar eso para consultar el campo _id.

me escribió una publicación que describe el proceso aquí: http://www.snailinaturtleneck.com/blog/2011/12/20/querying-for-timestamps-using-objectids/

+1

Interesante, pero ¿cómo iba a utilizar esto para un rango de fechas consulta en base a la fecha de creación dentro de la '_id'? –

+1

Actualicé mi respuesta para mostrar cómo se vería su consulta original. – kristina

+0

Muchas gracias por sus comentarios. En cuanto al rendimiento, ¿sería mejor almacenar el tiempo de creación como un campo separado? –

Cuestiones relacionadas