7.MongoDB的ObjectID
7.1 知识点
ObjectId 概述
ObjectId 是 MongoDB 中用于唯一标识文档的默认主键类型。它是一个 12 字节(96 位)的 BSON 类型,通常表示为一个 24 个字符的十六进制字符串,例如:64b645cd1f7e4c25fc00123d
。
ObjectId 构成
时间戳(4 字节):表示 ObjectId 创建时的秒级 Unix 时间戳。这使得 ObjectId 具有时间顺序性,文档按照
_id
字段排序通常也对应创建时间的先后顺序。机器标识符(3 字节):用于唯一标识生成此 ObjectId 的主机。通常由主机名或网络接口卡的哈希值生成。
进程 ID(2 字节):标识生成 ObjectId 的进程 ID,防止同一机器上不同进程生成重复的 ObjectId。
随机计数器(3 字节):用于确保同一时间戳内生成的 ObjectId 是唯一的。它是一个随机递增的值。
ObjectId 特点
全局唯一性:由于包含时间戳、机器标识符、进程 ID 和计数器的组合,每个 ObjectId 都是唯一的。
排序性:ObjectId 的前 4 个字节是时间戳,因此具有时间顺序性,文档按照
_id
字段排序通常也对应创建时间的先后顺序。高效性:ObjectId 占用 12 字节的存储空间,比使用传统的 UUID 更加节省空间。生成速度快且不会引起冲突。
可解读性:可以通过 ObjectId 的前 4 字节提取出文档的创建时间,适合日志分析、数据分片等需求。
ObjectId 用法
默认生成
如果在插入文档时没有显式指定 _id
,MongoDB 会自动生成一个 ObjectId。
db.collection.insertOne({ name: "Alice" })
// 插入后生成类似以下文档:
// { _id: ObjectId("64b645cd1f7e4c25fc00123d"), name: "Alice" }
查询与筛选
可以直接使用 ObjectId 查询文档。
db.collection.find({ _id: ObjectId("64b645cd1f7e4c25fc00123d") })
自定义 ObjectId
也可以手动生成 ObjectId。
var id = ObjectId(); // 自动生成一个新的 ObjectId
获取文档创建时间
由于 ObjectId 的前 4 字节是时间戳,可以通过 getTimestamp()
方法获取文档的创建时间。
var objectId = ObjectId("64b645cd1f7e4c25fc00123d");
var creationTime = objectId.getTimestamp();
print(creationTime); // 输出:ISODate("2025-02-20T12:51:41Z")
将 ObjectId 转换为字符串
在某些情况下,您可能需要将 ObjectId 转换为字符串格式。
var objectId = ObjectId("64b645cd1f7e4c25fc00123d");
var objectIdStr = objectId.str;
print(objectIdStr); // 输出:64b645cd1f7e4c25fc00123d
ObjectId 使用场景
主键标识:ObjectId 通常作为文档的主键,确保数据的唯一性。
时间维度分析:由于包含时间戳,可以根据 ObjectId 的顺序进行数据归档或分析。
分布式系统支持:在分布式环境下,不依赖数据库即可生成全局唯一的 ID。
ObjectId 解析示例
以 ObjectId:64b645cd1f7e4c25fc00123d
为例,进行解析:
64b645cd
(前 4 字节):时间戳,表示文档创建的时间。1f7e4c
(接下来的 3 字节):机器标识符。25fc
(再接下来的 2 字节):进程 ID。00123d
(最后 3 字节):随机计数器。
通过这些部分,可以清晰地解析出其创建时间和生成环境。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com