はじめに
開発環境ですがObjectIDを変更したがために発生した不具合を調査した経験からObjectIDを深堀ってみようと思いたちました。
ObjectIDとは
MongoDBのObjectIDは、12バイトのデータから構成される識別子で、ドキュメントごとに一意のIDを生成します。ドキュメントを生成する際にObjectIDを指定しなければ自動で生成されます。
ObjectIDを構成する要素
ただの文字列ではなく3つの要素から構成されていました。
- タイムスタンプ(最初の4バイト)
- Unixタイムスタンプ
- マシン識別子(3バイト)とプロセスID(2バイト)
- 一意のマシンID。MongoDBインスタンスが稼働しているサーバーを識別するために使用される。プロセスID。同じマシン上で複数のプロセスが同時にObjectIDを生成しても、IDの衝突が防がれる
- カウンター(最後の3バイト)
- 同じ秒内で生成されたObjectIDが重複しないようにするためのランダムカウンター
分解してみる
例:66b5b3d8735ba322ebdbd755
頭から下記の通りに分解できます。
タイムスタンプ: 66b5b3d8(2024-08-07 12:22:48 UTC)
マシンID+プロセスID: 735ba322eb
カウンター: dbd755
大小がある
ObjectIDには大小関係がありました。主にタイムスタンプ部分によって決定されます。これにより、ObjectIDを使ってドキュメントの生成時刻の順序を比較したり、ソートしたりすることができます。
まとめ
MongoDBに限らず他のIDなどにはタイムスタンプや自動増分などの概念がありました。勉強になりました!
最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください!