本文演示在 MongoDB Shell 中使用 new ObjectId() 生成新的唯一标识符,ObjectId 是 MongoDB 文档的默认主键 (_id)。
语法
new ObjectId()
在 Shell 中连续生成多个 ObjectId
> new ObjectId()
ObjectId("5cd7bf2f6d78f205348bc646")
> new ObjectId()
ObjectId("5cd7bf316d78f205348bc647")
> new ObjectId()
ObjectId("5cd7bf336d78f205348bc648")
> new ObjectId()
ObjectId("5cd7bf346d78f205348bc649")
> new ObjectId()
ObjectId("5cd7bf356d78f205348bc64a")
> new ObjectId()
ObjectId("5cd7bf396d78f205348bc64b")
> new ObjectId()
ObjectId("5cd7bf3a6d78f205348bc64c")
每次调用都生成唯一的 ObjectId
如上所示,每次调用 new ObjectId() 都会生成一个新的、唯一的 24 位十六进制字符串 (12 字节)。
ObjectId 结构解析 (12 字节 = 24 Hex Chars)
| 字节 | 位数 | 内容 | 说明 |
|---|---|---|---|
| 0-3 | 4 字节 | Timestamp | Unix 时间戳 (秒),大端序。可粗略按时间排序 |
| 4-8 | 5 字节 | Random | 机器标识 + 进程 ID (确保分布式唯一性) |
| 9-11 | 3 字节 | Counter | 进程内递增计数器 (每秒最多 1677 万个) |
从 ObjectId 提取时间戳
> ObjectId("5cd7bf2f6d78f205348bc646").getTimestamp()
ISODate("2019-05-12T07:30:07Z")
在应用代码中生成 ObjectId
// Node.js (MongoDB Driver)
const { ObjectId } = require('mongodb');
const id = new ObjectId(); // 生成新 ID
const idStr = id.toHexString(); // 转字符串
// Python (PyMongo)
from bson.objectid import ObjectId
id = ObjectId()
str_id = str(id)
// Java (MongoDB Java Driver)
import org.bson.types.ObjectId;
ObjectId id = new ObjectId();
// Go (mongo-go-driver)
import "go.mongodb.org/mongo-driver/bson/primitive"
id := primitive.NewObjectID()
手动指定 ObjectId (插入时自定义 _id)
> db.collection.insertOne({ _id: ObjectId("5cd7bf2f6d78f205348bc646"), name: "Custom ID" });
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7bf2f6d78f205348bc646") }
ObjectId vs UUID
| 特性 | ObjectId | UUID (RFC4122) |
|---|---|---|
| 长度 | 12 字节 (24 hex) | 16 字节 (32 hex + 4 hyphens) |
| 含时间戳 | 是 (前 4 字节) | v1 有,v4 无 |
| 生成位置 | 客户端/服务端 | 通常客户端 |
| 排序性 | 大致按时间 | v1 有序,v4 无序 |
| MongoDB 默认 | 是 (_id) | 否 |
MongoDB 3.6+ 生成 UUID
> UUID()
UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890")