为什么在 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.
一般顺序可能对特定应用程序有用,也可能没有用,但它确实有 一些 个用例。
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.
一般顺序可能对特定应用程序有用,也可能没有用,但它确实有 一些 个用例。