使用PHP中的_id进行Mongo日期范围查询

时间:2012-03-19 19:58:35

标签: php mongodb

作为mongo的新手,我在mongo手册中读到了有关优化对象ID的信息。

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结果。虽然我可以查询单个记录并从对象中提取日期。

1 个答案:

答案 0 :(得分:13)

在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/