MongoDBではObjectIdの代わりに任意の値をプライマリキーとして使うことができる
今回はMongoDBでのプライマリキー(主キー)の扱いの話です。
MongoDBでの主キーフィールドには実は任意の値を入れることが可能だったという話です。
調べても意外にもそのことに言及した書き込みが出てこなかったため書くことに。
まず前提から
MongoDBを使っていた際にプライマリキーにデフォルトのデータ型以外の値を入れたい場合が出てきました。
MongoDBではデフォルトのプライマリキーはObjectIdです。
MongoDBのObjectIdというのは12バイトの値を持つデータ型で、ドキュメント(RDBMSではレコードに相当)を作成するときにMongoDBによって自動的に生成されます。一意の値を持つように生成されるので、MongoDBではRDBMSにおける自動インクリメントされる整数に代わってプライマリキーとして使われます。
具体的には下のようなデータで、キーは必ず_idになります。
{ "_id" : ObjectId("507f1f77bcf86cd799439011") }
この_idにObjectId以外の値を入れたかったのですが、調べたところ次の記事に答えがありました。
_idフィールドの値はユーザー任意のデータで上書き可能
つまり、_idフィールドの値には文字列、整数(1, 2 etc...)や日付(JSのDateオブジェクト)を入れることも可能ということ。
ただしこの場合、{_id: 1}というようにユーザーが明示的に_idフィールドの値を書く必要があります1。
もしも、入力データに_idフィールドがなかった場合はDB側で自動的にObjectId型のプライマリキーが生成される実装になっているようです。
このように上書き可能な値ですが、ObjectIdを任意の値で上書きするには1つだけ条件があります。それは...
_idフィールド内で一意な値をもつこと(値が同カラム内で重複しない)
考えてみればプライマリキーなので値が重複しないことが条件なのは当たり前といえば当たり前です2。
UUIDなど一意な値を使うときに利用できるかも
値が一意でないといけないので、実際にObjectId以外だと使う場合が限られそうですが、
UUIDやULIDなどで代替したい場合にいいかも。
- 参考:ID生成大全
また、自動インクリメント整数をプライマリキーにすることも↓のような方法があるので組み合わせて実現できそうです。(こういう場合は素直にRDBMS使った方が楽だと思いますが)