ObjectId
是 MongoDB 中用於標識文件的唯一識別符號(ID),由 BSON 庫(bson
)提供的一個類。以下是 ObjectId
的作用及其常用操作。
ObjectId 的作用
- 唯一標識文件:
- 每個儲存在 MongoDB 中的文件都有一個
_id
欄位,預設型別是ObjectId
。 - 它是 12 位元組的值,由 MongoDB 自動生成,用來唯一標識一個文件。
- 每個儲存在 MongoDB 中的文件都有一個
- 文件查詢和操作:
- 使用
ObjectId
可以高效地查詢、更新或刪除特定文件。
- 使用
- 時間戳資訊:
ObjectId
包含文件建立時的時間戳,可以用於推斷文件的建立時間。
ObjectId 的結構
ObjectId
是一個 12 位元組(96 位)的值,由以下部分組成:
- 前 4 位元組:UNIX 時間戳(秒級)——文件建立時間。
- 接下來的 5 位元組:機器識別符號(主機 ID 和程序 ID 的組合)。
- 後 3 位元組:隨機計數器。
這種結構確保了其全域性唯一性,同時提供了時間戳功能。
常見用法
1. 生成一個新的 ObjectId
from bson import ObjectId
# 建立一個新的 ObjectId
new_id = ObjectId()
print(new_id) # 輸出: 例如 64eddb89ad14e44f5c6c9a1e
2. 轉換字串為 ObjectId
MongoDB 中 _id
通常儲存為 ObjectId
型別,如果你有一個文件 ID 的字串形式(如 "64eddb89ad14e44f5c6c9a1e"
),可以將其轉換為 ObjectId
。
id_str = "64eddb89ad14e44f5c6c9a1e"
object_id = ObjectId(id_str)
print(object_id) # 輸出: ObjectId('64eddb89ad14e44f5c6c9a1e')
3. 透過 ObjectId 查詢文件
from mongoengine import Document, StringField
from bson import ObjectId
class MyDocument(Document):
name = StringField()
# 查詢文件
doc_id = "64eddb89ad14e44f5c6c9a1e"
result = MyDocument.objects(id=ObjectId(doc_id)).first()
print(result.name)
4. 獲取 ObjectId 的時間戳
從 ObjectId
中提取時間戳,獲取文件的建立時間。
oid = ObjectId("64eddb89ad14e44f5c6c9a1e")
print(oid.generation_time) # 輸出: 文件建立的時間,UTC 時區
5. 比較 ObjectId
可以直接比較兩個 ObjectId
,因為它們是可排序的。
oid1 = ObjectId("64eddb89ad14e44f5c6c9a1e")
oid2 = ObjectId("64eddb89ad14e44f5c6c9a1f")
if oid1 < oid2:
print("oid1 是更早生成的")
注意事項
- 與字串的區別:
- 雖然可以將
_id
儲存為字串,但推薦使用預設的ObjectId
,因為它更高效且帶有時間戳。
- 雖然可以將
- 查詢時的型別匹配:
- 如果
_id
是ObjectId
型別,查詢時需要確保傳入的也是ObjectId
型別,否則會導致查詢不到結果。
- 如果
- 時間戳的時區問題:
ObjectId.generation_time
返回的是 UTC 時間,可能需要轉換為本地時間。
適用場景
- 預設主鍵
- MongoDB 預設為每個文件生成一個
ObjectId
,省去手動建立唯一標識的麻煩。
- MongoDB 預設為每個文件生成一個
- 全域性唯一性
- 在分散式系統中,可以使用
ObjectId
作為全域性唯一標識。
- 在分散式系統中,可以使用
- 高效查詢
ObjectId
是按時間排序的,因此在按時間範圍查詢文件時非常高效。