成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Mongodb 中的 _id 和 ObjectId

xfee / 2950人閱讀

摘要:和中存儲的文檔必須有一個鍵。這是的創(chuàng)建方式導致的。由于時間戳在前,這意味著大致會按照插入的順序排列。前字節(jié)保證了同一秒鐘不同機器不同進程產生的是唯一的。如果驅動程序允許服務器生成,那么將需要多帶帶的查詢,以確定插入的文檔中的值。

_id和ObjectId

MongoDB 中存儲的文檔必須有一個"_id" 鍵。這個鍵的值可以是任何類型的,默認是個ObjectId 對象。在一個集合里面,每個文檔都有唯一的"_id" 值,來確保集合里面每個文檔都能被唯一標識。如果有兩個集合的話,兩個集合可以都有一個值為123 的"_id" 鍵,但是每個集合里面只能有一個"_id" 是123 的文檔。

ObjectId

ObjectId 是"_id" 的默認類型。它設計成輕量型的,不同的機器都能用全局唯一的同種方法方便地生成它。這是MongoDB 采用ObjectId,而不是其他比較常規(guī)的做法(比如自動增加的主鍵)的主要原因,因為在多個服務器上同步自動增加主鍵值既費力還費時。MongoDB 從一開始就設計用來作為分布式數(shù)據(jù)庫,處理多個節(jié)點是一個核心要求。后面會看到ObjectId 類型在分片環(huán)境中要容易生成得多。

ObjectId 使用12 字節(jié)的存儲空間,每個字節(jié)兩位十六進制數(shù)字,是一個24 位的字符串。由于看起來很長,不少人會覺得難以處理。但關鍵是要知道這個長長的ObjectId 是實際存儲數(shù)據(jù)的兩倍長。

如果快速連續(xù)創(chuàng)建多個ObjectId,會發(fā)現(xiàn)每次只有最后幾位數(shù)字有變化。另外,中間的幾位數(shù)字也會變化(要是在創(chuàng)建的過程中停頓幾秒鐘)。這是ObjectId 的創(chuàng)建方式導致的。12 字節(jié)按照如下方式生成:

前4 個字節(jié)是從標準紀元開始的時間戳,單位為秒。這會帶來一些有用的屬性。時間戳,與隨后的. 5 個字節(jié)組合起來,提供了秒級別的唯一性。由于時間戳在前,這意味著ObjectId 大致會按照插入的順序排列。這對于某些方面很有用,如將其作為索引提高效率,但是這個是沒有保證的,僅僅是“大致”。這4 個字節(jié)也隱含了文檔創(chuàng)建的時間。絕大多數(shù)驅動都會公開一個方法從ObjectId 獲取這個信息。因為使用的是當前時間,很多用戶擔心要對服務器進行時間同步。其實沒有這個必要,因為時間戳的實際值并不重要,只要其總是不停增加就好了(每秒一次)。

接下來的3 字節(jié)是所在主機的唯一標識符。通常是機器主機名的散列值。這樣就可以確保不同主機生成不同的ObjectId,不產生沖突。

為了確保在同一臺機器上并發(fā)的多個進程產生的ObjectId 是唯一的,接下來的兩字節(jié)來自產生ObjectId 的進程標識符(PID)。

前9 字節(jié)保證了同一秒鐘不同機器不同進程產生的ObjectId 是唯一的。后3 字節(jié)就是一個自動增加的計數(shù)器,確保相同進程同一秒產生的ObjectId 也是不一樣的。同一秒鐘最多允許每個進程擁有2563(16 777 216)個不同的ObjectId。

自動生成_id

前面講到,如果插入文檔的時候沒有"_id" 鍵,系統(tǒng)會自動幫你創(chuàng)建一個。可以由MongoDB 服務器來做這件事情,但通常會在客戶端由驅動程序完成。理由如下。

雖然ObjectId 設計成輕量型的,易于生成,但是畢竟生成的時候還是產生開銷。在客戶端生成體現(xiàn)了MongoDB 的設計理念:能從服務器端轉移到驅動程序來做的事,就盡量轉移。這種理念背后的原因是,即便是像MongoDB 這樣的可擴展數(shù)據(jù)庫,擴展應用層也要比擴展數(shù)據(jù)庫層容易得多。將事務交由客戶端來處理,就減輕了數(shù)據(jù)庫擴展的負擔。

在客戶端生成ObjectId,驅動程序能夠提供更加豐富的API。例如,驅動程序可以有自己的insert 方法,可以返回生成的ObjectId,也可以直接將其插入文檔。如果驅動程序允許服務器生成ObjectId,那么將需要多帶帶的查詢,以確定插入的文檔中的"_id" 值。

原文:2.6.6 _id和ObjectId

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/18937.html

相關文章

  • mongoDB基礎篇①】安裝與常用操作語句

    摘要:簡述與同為數(shù)據(jù)庫但是為數(shù)據(jù)庫而為文檔型數(shù)據(jù)庫存儲的是文檔的二進制化內部執(zhí)行引擎為解釋器把文檔存儲成結構在查詢時轉換為對象并可以通過熟悉的語法來操作的安裝啟動在上直接下載解壓運行即可本身是已編譯好的二進制可執(zhí)行文件如果報錯說明你的服務器和 簡述 mongoDB與redis同為noSql數(shù)據(jù)庫,但是redis為kv數(shù)據(jù)庫(key/value),而mongoDB為文檔型數(shù)據(jù)庫存儲的是文檔(B...

    UCloud 評論0 收藏0
  • MongoDB中的范式與反范式

    摘要:反范式化與范式化相反將每個文檔所需的數(shù)據(jù)都嵌入在文檔內部。決定何時采用范式化何時采用反范式化時比較困難的。范式化能夠提高數(shù)據(jù)寫入速度,反范式化能夠提高數(shù)據(jù)讀取速度。 原文地址:http://pwhack.me/post/2014-06-25-1 轉載注明出處 本文摘錄自《MongoDB權威指南》第八章,可以徹底回答以下兩個問題: http://segmentfault.com/...

    littleGrow 評論0 收藏0
  • Mongodb使用

    摘要:表達式是無狀態(tài)的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。可以用來重命名增加或刪除域,也可以用于創(chuàng)建計算結果以及嵌套文檔用于過濾數(shù)據(jù),只輸出符合條件的文檔。 1.下載安裝 1.1.首先去官網下載mongodb對應版本安裝https://www.mongodb.com/download-center ?????解壓到目錄 例如:c:/mongo ?????創(chuàng)建文件夾用于m...

    luxixing 評論0 收藏0
  • [轉]mongodb中的populate方法

    摘要:使用可以實現(xiàn)在一個中填充其他的。表示關聯(lián)注意被關聯(lián)的的必須是和才有效。封裝了很多查詢的方法,使得對數(shù)據(jù)庫的操作變得簡單啦。這里分享一下方法用法。類型的時,格式如為表示不填充,為時表示填充。類型,可選,指定附加的查詢條件。 Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。 什么是ODM? 其實和ORM(Object Relational...

    ranwu 評論0 收藏0

發(fā)表評論

0條評論

xfee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<