Skip to content

Mongodb _id的生成

Mongodb自动生成 _id 字段, 它是一个ObjectId对象,值由12个字节组成, 如 62d178ab350c2fbc5a7f8371 它由0-9,a-f组成,是一个16进制的字符串,内存1个字节占八位,最大值是ff(255), 这就是为什么它只占了12个字节而不是24字节.

  • A 4-byte timestamp, representing the ObjectId's creation, measured in seconds since the Unix epoch.
  • A 5-byte random value generated once per process. This random value is unique to the machine and process.
  • A 3-byte incrementing counter, initialized to a random value.
62d178ab350c2fbc5a7f8371
时间戳机器码进程号自增值
  • 获取时间戳的日期
js
new Date(0x62d178ab * 1000); // Fri Jul 15 2022 22:24:43 GMT+0800 (China Standard Time)
  • 机器码
0x350c2f; // 3476527
  • 进程号
0xbc5a; // 48218
  • 自增值

自增值代表1秒内创建的文档数量,如果1s内创建的文档书超过3字节也就是 0xffffff, 那么mongodb的id就会出现重复

0x7f8371; // 8356721

判断是否为objectId

有一些mongodb的包可以判断objectId, 简单的方式可以使用正则, 如下

js
const _id = "62d178ab350c2fbc5a7f8371";
/[0-9a-f]{24}/i.test(_id); // true

Reference