7.MongoDB的ObjectID

  1. 7.MongoDB的ObjectID
    1. 7.1 知识点
      1. ObjectId 概述
      2. ObjectId 构成
      3. ObjectId 特点
      4. ObjectId 用法
      5. ObjectId 使用场景
      6. ObjectId 解析示例

7.MongoDB的ObjectID


7.1 知识点

ObjectId 概述

ObjectId 是 MongoDB 中用于唯一标识文档的默认主键类型。它是一个 12 字节(96 位)的 BSON 类型,通常表示为一个 24 个字符的十六进制字符串,例如:64b645cd1f7e4c25fc00123d

ObjectId 构成

  1. 时间戳(4 字节):表示 ObjectId 创建时的秒级 Unix 时间戳。这使得 ObjectId 具有时间顺序性,文档按照 _id 字段排序通常也对应创建时间的先后顺序。

  2. 机器标识符(3 字节):用于唯一标识生成此 ObjectId 的主机。通常由主机名或网络接口卡的哈希值生成。

  3. 进程 ID(2 字节):标识生成 ObjectId 的进程 ID,防止同一机器上不同进程生成重复的 ObjectId。

  4. 随机计数器(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

×

喜欢就点赞,疼爱就打赏