MongoDB ObjectId詳解及使用

2021-08-30 14:08:23 字數 1948 閱讀 1042

mongodb中我們經常會接觸到乙個自動生成的字段:」_id」,型別為objectid。

本文詳解objectid的構成和使用。

之前我們使用mysql等關係型資料庫時,主鍵都是設定成自增的。但在分布式環境下,這種方法就不可行了,會產生衝突。為此,mongodb採用了乙個稱之為objectid的型別來做主鍵。objectid是乙個12位元組的 bson 型別字串。按照位元組順序,一次代表:

4位元組:unix時間戳

3位元組:表示執行mongodb的機器

2位元組:表示生成此_id的程序

3位元組:由乙個隨機數開始的計數器生成的值

從objectid的構造上來看,內部就嵌入了時間型別。我們肯定可以從中獲取時間資訊:即插入此文件時的時間。mongodb對objectid物件提供了gettimestamp()方法來獲取objectid的時間。

> a = new objectid()objectid("53102b43bf1044ed8b0ba36b")> a.gettimestamp()isodate("2014-02-28t06:22:59z")
上例是直接使用mongodb提供的新建方法來構造objectid的,我們自己可不可以通過字串來構造呢?看下例:

// 使用date的字串構造方法生成日期,然後使用date物件的gettime獲取毫秒數,再除以1000得到標準時間戳

> a = new date("2012-12-12 00:00:00").gettime()/1000

1355241600

// 獲取時間戳的標準十六進製制表示

> a = a.tostring(16)

50c75880

// 在後面填補16個0

> a = a + new array(17).join("0") 50c758800000000000000000// 使用24個字串構造objectid

> b = new objectid(a) objectid("50c758800000000000000000")// 獲取時間以驗證

> b.gettimestamp() isodate("2012-12-11t16:00:00z")

上述過程中 new array(17).join(「0″)目的是生成16個0拼接的字串。

這裡使用了點小技巧。new array(17)構造了乙個17個元素的陣列,但是陣列裡面沒有元素,join(atr)方法的作用是連線陣列元素並且以其引數分割。17個元素正好有16個間隔,所以最終拼接起來的字串為16個。

根據objectid按照插入時間排序

mongodb預設在objectid上建立索引,是按照插入時間排序的。我們可以使用此索引進行查詢和排序。

// 按序插入三個文件

> db.col.insert()

> db.col.insert()

> db.col.insert()

> db.col.find().pretty()

為什麼選擇objectid

而不是遞增id?參考segmentfault上面的問題:mongodb修改」_id」的objectid到普通遞增id為什麼不好

如何取到objectid裡面的時間?

shell下可直接oid.gettimestamp()。各種驅動也都有對應的方法。

如何使用日期範圍來查詢objectid?

既然objectid是可以排序的,它當然也可以比較大小。在有日期範圍的情況下,實際上可以從_id中利用ixscan找到相應的記錄,而不需要根據另外乙個時間欄位來查詢。如果時間字段正好沒有索引的話,_id的優勢就體現出來了。stackoverflow上詳細講了該怎麼做。

使用自己生成的uuid字串和objectid比較哪個做_id更好?

MongoDB ObjectId詳解及使用

objectid構成 之前我們使用mysql等關係型資料庫時,主鍵都是設定成自增的。但在分布式環境下,這種方法就不可行了,會產生衝突。為此,mongodb採用了乙個稱之為objectid的型別來做主鍵。objectid是乙個12位元組的 bson型別字串。按照位元組順序,依次代表 objectid獲...

MongoDB ObjectId詳解及使用

mongodb中我們經常會接觸到乙個自動生成的字段 id 型別為objectid。本文會詳解objectid的構成和使用。objectid構成 之前我們使用mysql等關係型資料庫時,主鍵都是設定成自增的。但在分布式環境下,這種方法就不可行了,會產生衝突。為此,mongodb採用了乙個稱之為obje...

showModalDialog引數詳解 使用方法

基本介紹 showmodaldialog ie 4 支援 showmodelessdialog ie 5 支援 window.showmodaldialog 方法用來建立乙個顯示html內容的模態對話方塊。window.showmodelessdialog 方法用來建立乙個顯示html內容的非模態對...