from bson import ObjectId

XieBuWan發表於2024-11-18

ObjectId 是 MongoDB 中用於標識文件的唯一識別符號(ID),由 BSON 庫(bson)提供的一個類。以下是 ObjectId 的作用及其常用操作。


ObjectId 的作用

  1. 唯一標識文件
    • 每個儲存在 MongoDB 中的文件都有一個 _id 欄位,預設型別是 ObjectId
    • 它是 12 位元組的值,由 MongoDB 自動生成,用來唯一標識一個文件。
  2. 文件查詢和操作
    • 使用 ObjectId 可以高效地查詢、更新或刪除特定文件。
  3. 時間戳資訊
    • 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 是更早生成的")

注意事項

  1. 與字串的區別
    • 雖然可以將 _id 儲存為字串,但推薦使用預設的 ObjectId,因為它更高效且帶有時間戳。
  2. 查詢時的型別匹配
    • 如果 _idObjectId 型別,查詢時需要確保傳入的也是 ObjectId 型別,否則會導致查詢不到結果。
  3. 時間戳的時區問題
    • ObjectId.generation_time 返回的是 UTC 時間,可能需要轉換為本地時間。

適用場景

  • 預設主鍵
    • MongoDB 預設為每個文件生成一個 ObjectId,省去手動建立唯一標識的麻煩。
  • 全域性唯一性
    • 在分散式系統中,可以使用 ObjectId 作為全域性唯一標識。
  • 高效查詢
    • ObjectId 是按時間排序的,因此在按時間範圍查詢文件時非常高效。

相關文章