前言
在 MongoDB 中,每个文档都有一个唯一的 ID,这个 ID 被称为对象 ID(Object ID),它是一个由 12 个字节组成的十六进制字符串。对象 ID 一般用于唯一标识文档,在查询和更新文档时也经常用到。本文将详细介绍对象 ID 的结构和生成方法,以及在实际开发中的应用。
对象 ID 的结构
对象 ID 由 12 个字节(共 24 个十六进制字符)组成,它的结构如下:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | |--------------|-----------------|-----------------|-----------------| | 时间戳 | 机器 ID | 进程 ID | 计数器 |
其中,各个部分的含义如下:
- 时间戳(4 字节):表示对象 ID 的创建时间,精确到秒级别。
- 机器 ID(3 字节):表示生成对象 ID 的机器的唯一标识,一般是 MAC 地址的哈希值。如果生成对象 ID 的机器有多个网络接口,MongoDB 会使用其中一个接口的 MAC 地址。
- 进程 ID(2 字节):表示生成对象 ID 的进程的唯一标识。
- 计数器(3 字节):表示生成对象 ID 的计数器值,一般是一个自增的整数。它的值在同一秒内重复使用是不允许的,需要等到下一秒才能开始新的计数。
不同的机器、进程和时间戳都会影响对象 ID 的唯一性,因此,可以通过对象 ID 判断文档是否来自同一机器、进程或时间段。
对象 ID 的生成方法
在 MongoDB 中,可以通过 ObjectId() 函数生成对象 ID。这个函数定义在 bson 包中,使用时需要先导入该包。
示例代码如下:
const {ObjectId} = require('bson'); const id1 = new ObjectId(); // 生成一个新的对象 ID const id2 = new ObjectId('5f9b84a1a7decd050d069b5f'); // 根据字符串生成一个对象 ID
通过 new ObjectId() 生成的对象 ID,其时间戳是当前的本地时间(注意,不是 UTC 时间),机器 ID、进程 ID 和计数器都是随机的。如果要指定时间戳,可以在 new ObjectId() 中传入一个 Date 对象。
通过 new ObjectId('...') 生成对象 ID,其中的字符串应该是一个合法的 24 位十六进制字符串。如果字符串格式不正确,将抛出异常。需要注意的是,new ObjectId('...') 并不会检查字符串是否对应于一个有效的文档 ID,也不会检查该 ID 是否存在于数据库中。如果要检查 ID 的有效性,可以使用 db.collection.isValidObjectId() 函数。
对象 ID 的应用
由于对象 ID 具有唯一性和可排序性,因此,在实际开发中经常用于以下场景:
- 唯一标识文档。对象 ID 是 MongoDB 中文档的唯一标识符,可以用来查询和更新文档。
- 排序。根据对象 ID 可以对文档进行按时间排序,例如查找最近一段时间内创建的文档。
- 分片。在分布式系统中,可以使用对象 ID 来分散数据在不同的节点上,以达到负载均衡的效果。
- 数据库备份和恢复。在备份 MongoDB 数据库时,可以使用对象 ID 作为备份文件名或目录名,以便于快速恢复数据。
结论
对象 ID 是 MongoDB 中文档的唯一标识符,由时间戳、机器 ID、进程 ID 和计数器组成。通过 ObjectId() 函数可以生成对象 ID。在实际开发中,对象 ID 可以用于唯一标识文档、排序、分片和数据库备份和恢复等场景。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670363a3d91dce0dc84b63dd