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 }