Navicat 部落格

2019 年 3 月 26 日,由 Robert Gravelle 撰寫

開啟 MongoDB 資料庫中的任何一個文件,你會注意到文件中有一個 _id 欄位:


實際上,ObjectId 或 _id 是每個 MongoDB 文件中都存在的欄位。在本篇文章中,我們將探討它是什麼以及為什麼它對 MongoDB 資料庫很重要。

ObjectId 的結構

這些是 _id 的一些主要特徵的摘要:

  • _id 是集合中文件的主索引鍵,用于區分文件(記錄)。
  • _id 自動建立索引。指定 { _id: } 的查閱將 _id 索引作為其指南。
  • 預設情況下,_id 欄位的類型為 ObjectID,是 MongoDB 的 BSON 類型之一。如果需要,使用者還可以將 _id 覆蓋為 ObjectID 以外的其他內容。

ObjectID 長度為 12 位元組,由幾個 2-4 位元組的鏈結組成。每個鏈結代表並指定文件身份的具體內容。以下的值構成了完整的 12 位元組組合:

  • 一個 4 位元組的值,表示自 Unix 紀元以來的秒數
  • 一個 3 位元組的機器識別元
  • 一個 2 位元組的程序 ID
  • 一個 3 位元組的計數器,以隨機值開始

通常,你不必擔心要如何產生 ObjectID。如果文件尚未指派 _id 值,MongoDB 將自動產生一個 _id 值。

建立新的 ObjectId

如果你想自己產生新的 ObjectId,可以使用以下程式碼:

newObjectId = ObjectId()

你也可以直接在 Navicat 編輯器中輸入它。

這將會產生一個唯一的 _id,例如:

ObjectId("5349b4ddd2781d08c09890f3")

或者,你亦可以提供一個 12 位元組的 ID:

myObjectId = ObjectId("5349b4ddd2781d08c09890f4")

文件的建立時間戳記

由於 _id ObjectId 預設儲存了 4 位元組的時間戳記,因此在大多數情況下,你不必儲存文件的建立時間。你可以使用 getTimestamp 方法取得文件的建立時間:

ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

這將傳回此文件的 ISO 日期格式的建立時間

ISODate("2019-09-12T30:39:17Z")

將 ObjectId 轉換為字串(String)

在某些情況下,你可能需要得到字串格式的 ObjectId 值。若要轉換 ObjectId 為字串,請使用以下程式碼:

newObjectId.str

以上的程式碼將傳回 Guid 的字串格式的 ObjectId:

5349b4ddd2781d08c09890f3

文件排序

由於每個 ObjectId 都包含一個時間戳記,因此你可以用 _id 欄位將文件按建立時間排序。但請務必注意,此排序方法並不代表排序是嚴格或精確的,因為 ID 的其他元件也會影響,這會導致次序會反映其他變數,而不僅僅是建立時間。

變更 ObjectId

_id 欄位基本上是不可變更的。在建立文件之後,根據定義,它已被指派了一個無法變更的 _id。話雖如此,在插入新文件時是可以覆蓋 _id 的。覆蓋文件的 _id 欄位可能有其用處,但是當這樣做時,你有責任確保每個文件的 _id 值都是唯一的。

總結

MongoDB 的 _id 欄位在每個MongoDB集合中扮演重要角色。因此,了解它的建立方式以及何時覆蓋它對於管理集合非常有用。

如果你想了解有關 Navicat for MongoDB 的更多資訊,請瀏覽產品頁面產品頁面。如果你使用多種資料庫類型,可選擇支援 MongoDB 的Navicat Premium 12.1!

Navicat 文章
頻道記錄
分享
部落格封存檔