- MongoDB进阶与实战:微服务整合、性能优化、架构管理
- 唐卓章
- 426字
- 2021-05-19 17:44:43
3.3 ObjectId生成器
MongoDB集合中所有的文档都有一个唯一的_id字段,作为集合的主键。在默认情况下,_id字段使用ObjectId类型。如下面的代码:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_56_4.jpg?sign=1739421174-ZKWauauIDhm0cRo9y5MZwtQjFq277Ip5-0-c8c03af030ca88395c79a1a09739436d)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_57_1.jpg?sign=1739421174-wjtgsIOn5B1oFcr4vrMPmbIXRHbGQb0M-0-b33889cbb26cae3e993280b9c270abeb)
这里的_id是自动生成的,其中"5d15767ff4531cb8062f3c93"是ObjectId的16进制编码形式,该字段总共为12个字节。
为了避免文档的_id字段出现重复,ObjectId被定义为3个部分:
● 4字节表示Unix时间戳(秒)。
● 5字节表示随机数。
● 3字节表示计数器(初始化时随机)。
由此可见,经过多个字段随机组合后,出现重复的概率是极低的。
对于新插入集合中的文档,如果没有包含_id字段,则数据库服务器会自动生成一个新的ObjectId。但实际上,大多数客户端驱动都会自行生成这个字段,比如MongoDB Java Driver会根据插入的文档是否包含_id字段来自动补充ObjectId对象。这样做不但提高了离散性,还可以降低MongoDB服务器端的计算压力。另外,在ObjectId的组成中,5字节的随机数并没有明确定义,客户端可以采用机器号、进程号来实现,如图3-2所示。
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_57_2.jpg?sign=1739421174-jBAnykrvVubTqpGvHvYQ27WBWUWN0pyI-0-0b40964f0ac5e6fc5fb63916712b8d3b)
图3-2 ObjectId结构
ObjectId具体如何生成,可以参考下面的代码:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_57_3.jpg?sign=1739421174-h9A9T4CHsib8XYZRJlkRHsg95SomwBtW-0-429eb815956799abc80c745567aa42a9)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_58_1.jpg?sign=1739421174-1tCtAEFNIFrZz7Zrh72vooBQFmKqyeuk-0-582495994bfe85783f46b53e834ac92a)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_59_1.jpg?sign=1739421174-8KD0iM8qQZh4pYUM5QwqxmRE2nPFMmfh-0-c1aee51cd11fb1d3ae677af750c8b52d)
以上代码来自MongoDB Java Driver(3.6.2版本)。当然,具体应用也可以使用自动生成的_id,但必须保证_id的唯一性。