Монго запрос диапазона дат с использованием _id в PHP - PullRequest
5 голосов
/ 19 марта 2012

Будучи относительно новым для монго, я прочитал в руководстве по монго об оптимизации идентификаторов объектов.

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 Ответ

13 голосов
/ 20 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...