2012-03-19 90 views
5

对于mongo而言,我是阅读了有关优化对象ID的mongo手册。在PHP中使用_id的Mongo日期范围查询

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

约没有建立独立的Created_On场建议走,我决定以后提取出从_id领域这是一个ObjectID

现在,我有很多记录都同出一Created_On场的日期。

我试图查询的日期范围,但是我不能确定的语法:

$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))); 

始终返回0的结果。虽然我可以查询单个记录并从对象中提取日期。

回答

12

在PHP中,你需要做的是这样的:

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

然后,你可以用它来查询_id领域。

我写了一篇博客文章在这里描述的过程:http://www.snailinaturtleneck.com/blog/2011/12/20/querying-for-timestamps-using-objectids/

+1

有趣,但我怎么会用这个基于'_id'内的创建日期的日期范围查询? – 2012-03-19 20:55:22

+1

我更新了我的回复以显示您的原始查询的外观。 – kristina 2012-03-19 21:30:25

+0

非常感谢您的反馈。关于性能,将创建时间作为单独的字段存储会更好吗? – 2012-03-19 21:46:07