使用除了【MongoDB】ObjectId之外的主键
MongoDB可以使用任意值作为主键,而不是使用ObjectId。
本文讲述的是关于在MongoDB中处理主键(Primary Key)的话题。
MongoDB的主键字段实际上可以存入任意值的事实,因为在搜索过程中并没有找到提及这一点的帖子,所以决定写一篇文章来介绍这个。
首先从前提上来看
在使用MongoDB时,出现了需要将非默认数据类型的值放入主键的情况。
在MongoDB中,默认的主键是ObjectId。
- MongoDB Manual – ObjectId
MongoDB的ObjectId是一种包含12个字节的数据类型,在创建文档时(相当于RDBMS中的记录),它会自动由MongoDB生成。它被用作主键,代替了在RDBMS中自动递增的整数,因为它生成的值是唯一的。
具体数据如下,键必须为”_id”。
{ "_id" : ObjectId("507f1f77bcf86cd799439011") }
我想将非ObjectId值放入这个_id中,但在查找后,发现了下面这篇文章的答案。
- MongoDB Manual – [Documents] The _id Field
_id字段的值可以被用户任意数据覆盖。
换句话说,可以在 _id 字段的值中放入字符串、整数(1、2等等)或日期(JS 的 Date 对象)。
在这种情况下,用户需要明确地写入_id字段的值,如{_id: 1}。
如果输入的数据中没有_id字段,数据库会自动生成一个ObjectId类型的主键。
要以任意值覆写ObjectId,只需满足一个条件。那就是…
- _idフィールド内で一意な値をもつこと(値が同カラム内で重複しない)
考虑一下,由于它是主键,所以值不重复是当然的条件。
在使用UUID或其他唯一值时可能会有用
由于值必须是唯一的,所以实际上只有在不使用ObjectId时,才能有限地使用。但是,如果要使用UUID或ULID等替代方法,可能是一个不错的选择。
- 参考:ID生成大全
另外,为了实现自动递增整数作为主键,还可以结合以下方法。(不过,在这种情况下,我认为使用关系型数据库会更方便)
- MongoDB で 自動インクリメント シーケンス を 作成する 方法
顺便说一句,无法更改字段名为” _id”。它必须是名为 “id” 的字段作为主键。此外,MongoDB是一个无模式的NoSQL数据库,所以在_id字段内的数据类型不需要相同。例如,即使在同一个字段内混合整数和字符串的值也没有问题。