使用除了【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字段内的数据类型不需要相同。例如,即使在同一个字段内混合整数和字符串的值也没有问题。
广告
将在 10 秒后关闭
bannerAds