MongoDB ObjectIdとは?

MongoDB ObjectIdは、MongoDBコレクション内のすべてのドキュメントのデフォルト_idフィールドとして使用される12バイト(24文字の16進数)の一意識別子です。その構造はランダムではなく、意味のある情報がエンコードされています。最初の4バイトには、ObjectIdが作成された秒を表すUnixタイムスタンプが格納されています。残りのバイトには、同じマシン上で同じ秒に複数のドキュメントが挿入された場合でも一意性を保証するための、ランダム値とインクリメントカウンターが含まれています。

作成タイムスタンプが識別子に直接組み込まれているため、別途createdAtフィールドを保存しなくても、ドキュメントがいつ作成されたかを正確に判断できます。

タイムスタンプの埋め込み方法

507f1f77bcf86cd799439011のようなObjectIdは、次のように分解されます:

バイト 16進数文字 用途
1〜4 507f1f77 Unixタイムスタンプ(エポックからの秒数)
5〜9 bcf86cd799 ランダム値(マシン/プロセスごとに一意)
10〜12 439011 インクリメントカウンター

最初の8文字の16進数507f1f77を10進数に変換すると1350844279となり、2012-10-21T21:17:59.000Zに対応します。

ツールの説明

このツールは、有効なMongoDB ObjectIdから埋め込みタイムスタンプを抽出し、複数の日付形式で表示します。ObjectIdを貼り付けるだけで、ISO 8601形式の日付、UTC日付、ローカル日付、および生のUnixタイムスタンプを即座に確認できます。データベース接続やコードは不要です。

使用例

入力ObjectId 抽出された日付(UTC)
507f1f77bcf86cd799439011 2012-10-21T21:17:59.000Z
65a1fc2b0000000000000000 2024-01-13T04:44:27.000Z
000000000000000000000000 1970-01-01T00:00:00.000Z

機能

  • 即時抽出:入力と同時に結果が表示されます。ボタンのクリックは不要です
  • 複数の形式:ISO 8601、UTC、ローカル日時、Unixタイムスタンプを表示
  • 入力検証:有効な24文字の16進数文字列以外は受け付けません
  • 依存関係なし:サーバーへの通信や外部ライブラリを使用せず、ブラウザ上で完全に動作
  • コピー対応出力:各出力フィールドを個別にコピー可能

ユースケース

  • デバッグ:データベースにクエリを実行せずに、ドキュメントがいつ挿入されたかを素早く確認
  • 監査:エクスポートされたObjectIdリストやログファイル内の作成タイムスタンプを検証
  • フォレンジクス:データ移行やインシデント調査中にレコードの作成日時を特定

動作の仕組み

  1. ObjectIdの最初の8文字の16進数を取得します。
  2. 32ビットのビッグエンディアン16進数整数として解析し、秒単位のUnixタイムスタンプを取得します。
  3. 1000を乗算してJavaScriptのDateオブジェクトに渡します。
  4. 結果の日付をISO 8601、UTC文字列、ロケール対応文字列、および生の秒数にフォーマットします。

制限事項

  • 抽出されるのは作成タイムスタンプのみです。ObjectIdのランダム部分とカウンター部分は、ユーザーにとって意味のあるデータを持たないため、デコードされません。
  • カスタムまたはゼロのタイムスタンプで生成されたObjectIdは、有効ではあるものの、誤解を招く可能性のある日付を返すことがあります。
  • ローカル日付の形式は、ブラウザのロケール設定によって異なります。

よくある質問

任意のMongoDB ObjectIdから日付を抽出できますか? はい。MongoDBのdriver、Mongoose、mongosh、またはFaker.jsなどのツールによって生成されたすべての標準的なMongoDB ObjectIdには、最初の4バイトに有効なタイムスタンプが含まれています。

これはcreatedAtフィールドと同じですか? ObjectIdが挿入時に生成された場合(デフォルト)のみ同じです。カスタムObjectIdが手動で指定された場合、埋め込まれたタイムスタンプが実際の作成日時と異なる場合があります。

古いバージョンのMongoDBのObjectIdでも動作しますか? はい。4バイトのタイムスタンププレフィックスは、MongoDBの初回リリース以来、ObjectId仕様の一部となっています。時間の経過とともに変更されたのは中間バイト(マシンIDからランダム値へ)のみであり、このツールではデコードしません。