php – 將日期時間轉換為 Mongo ObjectId

最近在 Laravel 開發使用 MongoDB 做時間區間的篩選。

因為 Mongo 預設的 _id 具有時間戳記,因此篩選某個時間區段,可以直接透過 _id 做取得。那問題是,如何把時間轉換為 _id 格式呢?以下程式碼提供參考

<?php

namespace App\Libraries;

use MongoDB\BSON\ObjectId;

class MongoDB
{
    /**
     * 透過指定日期時間,取得 Mongo ObjectId
     *
     * @param string $timeString 時間字串,如 2019-01-01 12:52:14 或 2019-01-01 ,只要是時間字串即可
     * @return ObjectId 返回 Mongo _id 格式
     */
    public static function getObjectIdFromTimeString(string $timeString): ObjectId
    {
        $timestamp = strtotime($timeString);
        return new ObjectId(dechex($timestamp) . str_repeat("0", 16));
    }
}

那麼 Laravel 就可以這樣比對

$id = MongoDB::getObjectIdFromTimeString("2020-02-11 11:18:15");

$result = Interview::select("_id")
    ->where("_id", ">=", $id)
    ->get();

發表迴響