MongoDB中ObjectId生成規則參考

2021-08-25 22:31:13 字數 2147 閱讀 8191

mongodb中我們經常會接觸到乙個自動生成的字段:」_id」,型別為objectid。本文會詳解objectid的構成和使用。

objectid構成

之前我們使用mysql等關係型資料庫時,主鍵都是設定成自增的。但在分布式環境下,這種方法就不可行了,會產生衝突。為此,mongodb採用了乙個稱之為objectid的型別來做主鍵。objectid是乙個12位元組的 bson 型別字串。按照位元組順序,一次代表:

4位元組:unix時間戳 

3位元組:表示執行mongodb的機器 

2位元組:表示生成此_id的程序 

3位元組:由乙個隨機數開始的計數器生成的值 

objectid獲取時間

從objectid的構造上來看,內部就嵌入了時間型別。我們肯定可以從中獲取時間資訊:即插入此文件時的時間。mongodb對objectid物件提供了gettimestamp()方法來獲取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

// 在後面填補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()   

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

db.col.find().sort().pretty()   

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

db.col.find().sort().pretty()   

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

num2 = objectid(「53102fb9bf1044ed8b0ba36d」) 

objectid(「53102fb9bf1044ed8b0ba36d」)

// 找出插入時間在num2之後的資料

db.col.find(}).pretty() 

如何在Windows上編譯Objective C

objective c現在幾乎已經變成了蘋果的專利了,可以直接在蘋果的xcode上編譯objective c程式,但是在windows平台下的編譯工具就寥寥無幾了,本身這種語言用的人就不是很多。今天在網上突然看到了有人發帖,可以在windows平台下編譯objective c,就抱著好奇的心態試了試...

mongodb中的聚合

mongodb提供三種方式來實現聚合 聚合管道,map reduce,及單一目的的聚合方法。管道操作可以在分片的集合上運算,可以使用索引來提高效率,管道使用了mongodb內部的操作來進行高效資料聚合,是聚合操作的首選。tch sort操作出現在管道的開始位置時候可以使用索引。在3.2開始索引可以覆...

mongodb中的索引二

通常mongodb中的索引的建立方式如下 這種方式下,已經排好順序了,所以只要在排好序的key中找滿足查詢條件的記錄即可,需要掃瞄的資料量比較大,還有一種索引的建立方式 這種建立的方式中,不需要掃瞄很多的記錄,在索引中查詢滿足條件的記錄,但是需要在記憶體中排序,如果滿足記錄的條件很多,就要消耗很多的...