2012-03-19 30 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