为什么在 MongoDB 个 ID 中有一个增量计数器?

Why is there an incremental counter in MongoDB IDs?

specification 表示一行的 ID,例如在 Python 中使用

获得
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
res = mycol.insert_one({"name": "John", "address": "Highway 37"})
print(res.inserted_id)

是:

a 4-byte timestamp value, representing the ObjectId’s creation, measured in seconds since the Unix epoch
a 5-byte random value
a 3-byte incrementing counter, initialized to a random value

开始于:

我了解 ID 的字典顺序没有用:它有助于了解之前是否记录过记录另一个(例如:同一秒内有两条记录)。

问题:为什么 "incremental counter" 在 ID 的上下文中有用,之前的字节是非增量的?


更准确地说,为什么:5 个随机字节 + 3 个增量字节比 8 个随机字节/64 位 UUID 更能保证唯一性?

Question: For which reason would an "incremental counter" be useful in the context of an ID for which the previous bytes are non-incremental?

为了唯一性。如果您不覆盖它,ObjectId 是默认索引,因此计数器确保每条记录始终是唯一的。

这是新规范。原始规范使用时间戳 + PID + 计数器。也可能有几个字节来自机器上的某些东西。这在理论上通过使用创建它的实例的唯一值标记每个生成的 ID 来提供唯一性。

但是,已确定当服务在系统重新启动时自动启动时,后续重新启动通常会以相同的 PID 结束。对于多个相同的系统,尤其是 VM,它们中的多个可能具有相同的 PID。

随机值在确保唯一性方面做得更好。让每个实例仅 select 一个随机值一次,并在它 运行 的持续时间内使用该值会减少 2 个实例具有相同随机值的机会。

计数器仅允许每个实例每秒生成最多 2^24 个唯一值,并且该值不会重复。

以随机值启动计​​数器有助于减少 2 个实例生成相同 5 字节随机值的可能性并非完全为零。

the lexicographical order over IDs is not useful

ObjectId 没有严格排序。但是,它们 普遍 增加。

这是在the documentation中调用的:

sorting on an _id field that stores ObjectId values is roughly equivalent to sorting by creation time.

While ObjectId values should increase over time, they are not necessarily monotonic.

一般顺序可能对特定应用程序有用,也可能没有用,但它确实有 一些 个用例。