コンテンツにスキップ

MongoDBオブジェクトID生成ツール - ユニークなBSONID作成

MongoDBのドキュメントで使われる有効なObjectIDをブラウザ上で瞬時に生成する無料ツール。タイムスタンプ、ランダム値、インクリメントするカウンターから構成される12バイトのBSON識別子を、1個から100個までまとめて作成でき、開発、テスト、データベース設計に利用できます。

MongoDB オブジェクトID生成ツール

ローディング計算機...
📚

ドキュメンテーション

MongoDB ObjectIDとは?

MongoDBのObjectIDは、MongoDBがすべてのドキュメントの_idフィールドに既定で割り当てる、12バイトの値です。24文字の小文字の十六進数で表記され、例として507f1f77bcf86cd799439011のようになります。このツールは、データベース接続なしで、ブラウザー上で直接、1個から100個までの有効なObjectIDを一度に生成します。

MongoDB ObjectIDの構造

ObjectIDは、順番に並べた3つの部分で構成されます。

  • タイムスタンプ(4バイト)。 1970年1月1日(Unixエポック)からの秒数で、符号なしのビッグエンディアン数として格納されます。ObjectIDが作成された時刻を記録します。
  • ランダム値(5バイト)。 プログラムの起動時に一度だけランダムに選ばれる数値です。その後、そのプログラムが作成するすべてのObjectIDで同じランダム値を再利用するため、異なるコンピューター間で調整する必要がありません。
  • カウンター(3バイト)。 0から16,777,215までの範囲でランダムに選ばれた値から始まり、新しいObjectIDごとに1ずつ増加します。16,777,215を超えると、0へ戻ります。

これらの部分をつなげると、次のようになります。

1timestamp (8 hex chars) + random value (10 hex chars) + counter (6 hex chars) = 24 hex chars
2

以前のMongoDBドライバーは、中央の部分をランダム値ではなく、マシン識別子とプロセスIDから構成していました。現在のドライバーは、このツールのロジックも含め、プロセスごとに1つのランダムな5バイト値を使用します。

MongoDB ObjectIDの形式と計算式

ObjectIDには、パーセンテージや利息計算のような算術式はありません。三つの数値を十六進テキストに変換し、それらを順番につなげて作成します。

  1. Unixエポックからの現在の時刻を秒単位で取得します。それを8桁の十六進数で書きます。
  2. プロセスに固定されたランダム値を取得します。これは0以上2^40 − 1以下の数値です。それを10桁の十六進数として記述します。
  3. カウンターの現在値(0から16,777,215まで)を取得します。それを6桁の十六進数として記述し、次のIDに備えてカウンターを1増やします。
  4. 三つの十六進文字列をその順番でつなぎ、24文字の一つの文字列にします。

例

プログラムがUnix時刻1,700,000,000秒、つまり2023年11月14日の22:13:20 UTCに開始したとします。ランダム値として3f2a91c8d4を選び、カウンターを12,345から開始します。

  • 十六進数で表したタイムスタンプ:6553f100
  • 十六進数で表したランダム値:3f2a91c8d4
  • 十六進数で表したカウンター:003039

これらをつなげると、最初のObjectIDになります。

6553f1003f2a91c8d4003039

プログラムが同じ秒に2つ目のObjectIDを生成すると、タイムスタンプとランダム値は同じままですが、カウンターは12,346(00303a)に増加します。

6553f1003f2a91c8d400303a

ObjectIDは逆方向に読み取ることもできます。507f1f77bcf86cd799439011の先頭8文字である507f1f77をデコードすると、エポックから1,350,508,407秒後、つまり2012年10月17日の21:13:27 UTCとなります。

MongoDB ObjectIDの一般的な用途

  • 主キー。 MongoDBは、別の値が指定されていない限り、ドキュメントの_idフィールドにObjectIDを自動的に格納します。
  • 作成時刻の参照。 タイムスタンプが埋め込まれているため、別の日付フィールドがなくても、プログラムでドキュメントのおおよその作成時刻を読み取れます。
  • 挿入順による並べ替え。 値の先頭にタイムスタンプがあるため、_idでドキュメントを並べ替えると、概ね作成時刻順になります。
  • テストデータとモックデータ。 開発者は、データベースを実行せずに、生成したObjectIDを使ってサンプルドキュメントや自動テストを作成します。

MongoDB ObjectIDとUUIDの比較

UUID(汎用一意識別子)は、ObjectIDより四バイト大きい16バイトの値です。バージョン4のUUIDは乱数から作られるため、作成時刻を示さず、作成順にも並びません。同じ規格では、ミリ秒単位のUnixタイムスタンプで始まり、時刻順に並ぶバージョン7のUUIDも定義されています。ObjectIDはより短く、おおむね時刻順です。RFC 9562は、UUIDを空間と時間にわたって一意になることを意図したものと説明しつつ、実装者に衝突の結果を検討するよう求めています。どちらの形式でも、実際には衝突はきわめて起こりにくいです。

よくある質問

MongoDB ObjectIDは何に使われますか? MongoDBがドキュメントの_idフィールドに設定するデフォルト値です。そのため、追加の設定なしで、すべてのドキュメントに一意のキーが付与されます。

MongoDB ObjectIDは一意であることが保証されていますか? 形式上、数学的な意味で保証されているわけではありませんが、衝突が起きる可能性は極めて低いです。2つのObjectIDが衝突するには、同じ秒に同じランダム値と同じカウンター位置を持つ必要があり、通常これは単一のプロセス内でしか起こりません。

ObjectIDから作成日を読み取れますか? はい。先頭の8個の十六進文字、つまり4バイトに、Unixエポックからの秒数が格納されています。その数値を日付に変換すると、おおよその作成時刻が得られます。

このジェネレーターは一度にいくつのObjectIDを生成できますか? 1回のバッチにつき1~100個です。1つのバッチ内のすべてのIDは、プロセス全体で共有される同じランダム値を持ち、それぞれのカウンターは直前の値より1つ大きくなります。

MongoDB ObjectIDはMongoDB以外でも使用できますか? はい。十六進テキストとしてエンコードされた単なる12バイト値なので、他のシステムでも一意なIDとして機能します。ただし、データベース固有のID方式のほうが、その用途に適している場合があります。

このジェネレーターは実際のMongoDBデータベースに接続されていますか? いいえ。すべてブラウザー上で実行され、データベースから読み取ったり、データベースに書き込んだりすることはありません。

参考文献

  1. MongoDB。BSON Types: ObjectId。BSON型 — ObjectIdは12バイト(4バイトのタイムスタンプ、5バイトのランダム値、3バイトのカウンター)で、既定で_idに設定され、おおむね作成時刻順に並びます。
  2. MongoDB。ObjectID specification。BSON ObjectID仕様 — 符号なしビッグエンディアンのタイムスタンプ、プロセスごとに一度生成されるランダム値、ランダムな値から始まり、16,777,215を超えると0へリセットされるカウンター、および古いマシンIDとプロセスIDのフィールド。
  3. IETF。RFC 9562: Universally Unique IDentifiers (UUIDs)。RFC 9562 — UUIDは16オクテット(128ビット)で、バージョン4はランダム、バージョン7は時刻順です。