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 }