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が作成された時刻を記録します。4バイトには0から4,294,967,295までの値を格納できるため、2106年2月7日の06:28:15 UTC後にフィールドは0へ戻ります。
- ランダム値(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には、パーセンテージや利息計算のような算術式はありません。三つの数値を十六進テキストに変換し、それらを順番につなげて作成します。
- Unixエポックからの現在時刻を秒単位で取得し、四バイトに収まるよう0から4,294,967,295までの範囲に収めます。それを8桁の十六進数として記述します。
- プロセスに固定されたランダム値を取得します。これは0以上2^40 − 1以下の数値です。それを10桁の十六進数として記述します。
- カウンターの現在値(0から16,777,215まで)を取得します。それを6桁の十六進数として記述し、次のIDに備えてカウンターを1増やします。
- 三つの十六進文字列をその順番でつなぎ、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(Universally Unique Identifier、汎用一意識別子)は16バイトの値で、ObjectIDより4バイト大きくなります。標準的なUUIDは通常、全体がランダムであるため、作成時刻を示したり、作成順に並んだりしません。ObjectIDはより短く、おおよそ時刻順になるため、MongoDBがデフォルトで使用する理由の1つとなっています。ただし、適切に生成された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データベースに接続されていますか? いいえ。すべてブラウザー上で実行され、データベースから読み取ったり、データベースに書き込んだりすることはありません。
参考文献
- "ObjectId." MongoDBマニュアル、https://www.mongodb.com/docs/manual/reference/method/ObjectId/.
- "ObjectId Specification." MongoDB BSON仕様、https://github.com/mongodb/specifications/blob/master/source/bson-objectid/objectid.md.
- "BSON Types." BSON仕様、https://bsonspec.org/spec.html.