MongoDB中_id(ObjectId)生成

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

以前咱們使用MySQL等關係型數據庫時,主鍵都是設置成自增的。但在分佈式環境下,這種方法就不可行了,會產生衝突。爲此,mongodb採用了一個稱之爲ObjectId的類型來作主鍵。ObjectId是一個12字節的 BSON 類型字符串。按照字節順序,一次表明:數據庫

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

從ObjectId的構造上來看,內部就嵌入了時間類型。咱們確定能夠從中獲取時間信息:即插入此文檔時的時間spa

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

 

上例是直接使用MongoDB提供的新建方法來構造ObjectId的,咱們本身可不能夠經過字符串來構造呢?看下例:code

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

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

 MongoDB默認在ObjectId上創建索引,是按照插入時間排序的。咱們能夠使用此索引進行查詢和排序。blog

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 }
相關文章
相關標籤/搜索