Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB 生成 ObjectId:Shell 中使用 new ObjectId()

本文演示在 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-34 字节TimestampUnix 时间戳 (秒),大端序。可粗略按时间排序
4-85 字节Random机器标识 + 进程 ID (确保分布式唯一性)
9-113 字节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

特性ObjectIdUUID (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")