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內容的非模態對...