MongoDB - ObjectId: 入門指南

你好,未來的數據庫魔法師們!今天,我們將踏上一段令人興奮的旅程,進入 MongoDB 的世界以及其獨特的標識符:ObjectId。別擔心如果你是編程新手——我將成為你的友好指導者,一步步為你解釋一切。所以,來一杯咖啡,我們一起來探索!

MongoDB - ObjectId

ObjectId 是什麼?

在我們開始創建 ObjectIds 之前,讓我們先了解它們是什麼。想像你正在組織一個巨大的圖書館。每本書都需要一個獨特的代碼,這樣你才能輕鬆找到它。ObjectId 正是為 MongoDB 文檔做的同樣的事情——它為每個文檔提供了一個獨特的標識符。

ObjectId 是一個 12 字節的值,包括:

  • 一個 4 字節的時間戳
  • 一個 5 字節的隨機值
  • 一個 3 字節的遞增計數器

現在,讓我們看看如何在 MongoDB 中使用 ObjectIds!

創建新的 ObjectId

創建一個新的 ObjectId 就像做三明治一樣簡單(好吧,差不多)。當你在插入一個新文檔時沒有指定 _id 字段,MongoDB 會自動生成一個 ObjectId。但如果你想要自己創建一個呢?讓我們看看!

from bson.objectid import ObjectId

# 創建一個新的 ObjectId
new_id = ObjectId()

print(new_id)

當你運行這段代碼時,你會看到類似於以下內容:

ObjectId('60d5ecb54f52a1b8c9a8e9d7')

每次運行這段代碼,你會得到一個不同的 ObjectId。就像雪花一樣——沒有兩個是完全相同的!

理解輸出

讓我們分解一下我們剛才做了什麼:

  1. 我們從 bson 模塊導入了 ObjectId 類。(BSON 是 MongoDB 用於存儲數據的二進制格式。)
  2. 我們通過調用 ObjectId() 創建了一個新的 ObjectId。
  3. 我們打印了新的 ObjectId。

你所看到的字符串是的我們 12 字節 ObjectId 的十六進制表示。酷炫吧?

創建文檔的時間戳

現在,讓我們來當一次時間旅行者!我們可以從 ObjectId 中提取時間戳,以了解文檔是什麼時候創建的。當你想要追踪數據是什麼時候添加到你的數據庫時,這非常有用。

from bson.objectid import ObjectId
from datetime import datetime

# 創建一個新的 ObjectId
new_id = ObjectId()

# 獲取時間戳
timestamp = new_id.generation_time

print(f"這個文檔是在 {timestamp} 創建的")

運行這段代碼可能會給你類似於以下內容:

這個文檔是在 2023-06-21 15:30:45.000 創建的

發生了什麼?

  1. 我們像之前一樣創建了一個新的 ObjectId。
  2. 我們使用 generation_time 屬性來獲取時間戳。
  3. 我們打印了一個帶有時間戳的友好信息。

就像每个 ObjectId 里面都有一个微型时间机器,記得它出生的時候!

將 ObjectId 轉換為字符串

有時候,你可能需要將你的 ObjectId 轉換為字符串。也許你要將數據發送到網頁,或者你在與不理解 ObjectIds 的系統合作。別擔心——MongoDB 會為你提供支持!

from bson.objectid import ObjectId

# 創建一個新的 ObjectId
new_id = ObjectId()

# 轉換為字符串
id_string = str(new_id)

print(f"ObjectId: {new_id}")
print(f"字符串: {id_string}")

這將輸出類似於以下內容:

ObjectId: 60d5ecb54f52a1b8c9a8e9d7
字符串: 60d5ecb54f52a1b8c9a8e9d7

我們剛才做了什麼?

  1. 我們創建了一個新的 ObjectId。
  2. 我們使用 str() 函數將其轉換為字符串。
  3. 我們打印了 ObjectId 和字符串版本。

注意字符串版本看起來和 ObjectId 一模一樣,但沒有 ObjectId() 的外殼?就像脫掉超級英雄的服裝——下面,它仍然是同一個英雄!

福利:在 MongoDB 查詢中使用 ObjectIds

現在我們已經成為 ObjectId 的專家了,讓我們看看如何在 MongoDB 查詢中使用它們。這裡才是真正的魔法發生的地方!

from pymongo import MongoClient
from bson.objectid import ObjectId

# 連接到 MongoDB(假設它正在本地主機上運行)
client = MongoClient('mongodb://localhost:27017/')
db = client['my_database']
collection = db['my_collection']

# 插入一個文檔
result = collection.insert_one({'name': 'John Doe', 'age': 30})
inserted_id = result.inserted_id

print(f"插入的文檔 ID:{inserted_id}")

# 使用其 ObjectId 查詢文檔
found_document = collection.find_one({'_id': inserted_id})

print(f"找到的文檔:{found_document}")

這段腚本將輸出類似於以下內容:

插入的文檔 ID:60d5ecb54f52a1b8c9a8e9d7
找到的文檔:{'_id': ObjectId('60d5ecb54f52a1b8c9a8e9d7'), 'name': 'John Doe', 'age': 30}

分解它

  1. 我們連接到一個 MongoDB 數據庫和集合。
  2. 我們插入了一個新文檔並獲得了其 ObjectId。
  3. 我們使用那個 ObjectId 來查詢數據庫並找到我們的文檔。

這就像給某人一個獨特的鎖匙,用來打開他們的儲物櫃——有了 ObjectId,我們總能在巨大的 MongoDB 數據庫中找到我們的文檔!

結論

至此,各位!我們已經穿越了 MongoDB ObjectIds 的土地,創建它們,提取時間戳,將它們轉換為字符串,甚至還在查詢中使用它們。記住,ObjectIds 是 MongoDB 世界中的你的好朋友——它們幫助你保持數據的組織和易於訪問。

隨著你繼續 MongoDB 的冒險,你會發現 ObjectIds 到處都是。但現在,有了這些知識,你可以像專業人士一樣對待它們!

繼續練習,保持好奇心,並且愉快地編程!

方法 描述
ObjectId() 創建一個新的 ObjectId
ObjectId.generation_time 返回 ObjectId 生成時的時間戳
str(ObjectId) 將 ObjectId 轉換為字符串
collection.insert_one() 將一個文檔插入 MongoDB 集合並返回 ObjectId
collection.find_one({'_id': ObjectId}) 使用 ObjectId 在 MongoDB 集合中查找文檔

記住,在 MongoDB 的世界中,ObjectIds 是你可靠的夥伴。善待它們,它們將忠實地為你在數據庫冒險中服務!

Credits: Image by storyset