MongoDB中_id(ObjectId)生成


MongoDB 中我們經常會接觸到一個自動生成的字段:"_id",類型為ObjectId。

之前我們使用MySQL等關系型數據庫時,主鍵都是設置成自增的。但在分布式環境下,這種方法就不可行了,會產生沖突。為此,mongodb采用了一個稱之為ObjectId的類型來做主鍵。ObjectId是一個12字節的 BSON 類型字符串。按照字節順序,一次代表:

4字節:UNIX時間戳 
3字節:表示運行MongoDB的機器 
2字節:表示生成此_id的進程 
3字節:由一個隨機數開始的計數器生成的值 

從ObjectId的構造上來看,內部就嵌入了時間類型。我們肯定可以從中獲取時間信息:即插入此文檔時的時間

a = new ObjectId() 
ObjectId(“53102b43bf1044ed8b0ba36b”) 
a.getTimestamp() 
ISODate(“2014-02-28T06:22:59Z”) 
根據時間構造ObjectId

 

上例是直接使用MongoDB提供的新建方法來構造ObjectId的,我們自己可不可以通過字符串來構造呢?看下例:

// 使用Date的字符串構造方法生成日期 
// 然后使用Date對象的getTime獲取毫秒數,再除以1000得到標准時間戳

a = new Date(“2012-12-12 00:00:00”).getTime()/1000 
1355241600 
// 獲取時間戳的標准十六進制表示 
a = a.toString(16) 
50c75880

 MongoDB默認在ObjectId上建立索引,是按照插入時間排序的。我們可以使用此索引進行查詢和排序。

db.col.insert({“num”:1}) 
db.col.insert({“num”:2}) 
db.col.insert({“num”:3}) 
db.col.find().pretty() 
{ “_id” : ObjectId(“53102fb4bf1044ed8b0ba36c”), “num” : 1 } 
{ “_id” : ObjectId(“53102fb9bf1044ed8b0ba36d”), “num” : 2 } 
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : 3 }

 

// 按照_id升序,即按照插入時間升序

db.col.find().sort({“_id”:1}).pretty() 
{ “_id” : ObjectId(“53102fb4bf1044ed8b0ba36c”), “num” : 1 } 
{ “_id” : ObjectId(“53102fb9bf1044ed8b0ba36d”), “num” : 2 } 
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : 3 }

 

// 按照_id降序,即按照插入時間降序

db.col.find().sort({“_id”:-1}).pretty() 
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : 3 } 
{ “_id” : ObjectId(“53102fb9bf1044ed8b0ba36d”), “num” : 2 } 
{ “_id” : ObjectId(“53102fb4bf1044ed8b0ba36c”), “num” : 1 }

 

// 抽取num = 2的ObjectId用來過濾

num2 = ObjectId(“53102fb9bf1044ed8b0ba36d”) 
ObjectId(“53102fb9bf1044ed8b0ba36d”)

 

// 找出插入時間在num2之后的數據

db.col.find({ “_id”:{$gt:num2}}).pretty() 
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : 3 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM