MongoDB PHP MongoDate Tricks post

Posted on 2013-07-16 by jwage


Here are a few tricks I’ve learned working with MongoDB and PHP.

Create DateTime from MongoId

Because MongoDB identifiers contain the date you can easily create a DateTime instance from them.

public function getDateTimeFromMongoId(MongoId $mongoId)
{
    $dateTime = new DateTime('@'.$mongoId->getTimestamp());
    $dateTime->setTimezone(new DateTimeZone(date_default_timezone_get()));
    return $dateTime;
}

This is useful when you don’t want to create an additional field to store the date a document was created. You can also use the _id index that already exists to paginate and filter/sort by date.

Create MongoId with Date in the Past

For the same reason as above, you can create a MongoId instance with a date in the past. This was copied from a stackoverflow answer by Derek Rethans.

public createMongoIdFromTimestamp($timestamp)
{
    $ts = pack('N', $timestamp);
    $m = substr(md5(gethostname()), 0, 3);
    $pid = pack('n', posix_getpid());
    $trail = substr(pack('N', $this->inc++), 1, 3);

    $bin = sprintf('%s%s%s%s', $ts, $m, $pid, $trail);

    $id = '';
    for ($i = 0; $i < 12; $i++ ) {
        $id .= sprintf('%02X', ord($bin[$i]));
    }

    return new \MongoID($id);
}

This was useful when migrating legacy data in to a collection where we utilize the _id for pagination and displaying a created date. If we simply created identifiers with todays date then it would show old records with all the same date and pagination/sorting would be broken.

Categories: articles