摘要:和中存儲的文檔必須有一個鍵。這是的創建方式導致的。由于時間戳在前,這意味著大致會按照插入的順序排列。前字節保證了同一秒鐘不同機器不同進程產生的是唯一的。如果驅動程序允許服務器生成,那么將需要多帶帶的查詢,以確定插入的文檔中的值。
_id和ObjectId
MongoDB 中存儲的文檔必須有一個"_id" 鍵。這個鍵的值可以是任何類型的,默認是個ObjectId 對象。在一個集合里面,每個文檔都有唯一的"_id" 值,來確保集合里面每個文檔都能被唯一標識。如果有兩個集合的話,兩個集合可以都有一個值為123 的"_id" 鍵,但是每個集合里面只能有一個"_id" 是123 的文檔。
ObjectIdObjectId 是"_id" 的默認類型。它設計成輕量型的,不同的機器都能用全局唯一的同種方法方便地生成它。這是MongoDB 采用ObjectId,而不是其他比較常規的做法(比如自動增加的主鍵)的主要原因,因為在多個服務器上同步自動增加主鍵值既費力還費時。MongoDB 從一開始就設計用來作為分布式數據庫,處理多個節點是一個核心要求。后面會看到ObjectId 類型在分片環境中要容易生成得多。
ObjectId 使用12 字節的存儲空間,每個字節兩位十六進制數字,是一個24 位的字符串。由于看起來很長,不少人會覺得難以處理。但關鍵是要知道這個長長的ObjectId 是實際存儲數據的兩倍長。
如果快速連續創建多個ObjectId,會發現每次只有最后幾位數字有變化。另外,中間的幾位數字也會變化(要是在創建的過程中停頓幾秒鐘)。這是ObjectId 的創建方式導致的。12 字節按照如下方式生成:
前4 個字節是從標準紀元開始的時間戳,單位為秒。這會帶來一些有用的屬性。時間戳,與隨后的. 5 個字節組合起來,提供了秒級別的唯一性。由于時間戳在前,這意味著ObjectId 大致會按照插入的順序排列。這對于某些方面很有用,如將其作為索引提高效率,但是這個是沒有保證的,僅僅是“大致”。這4 個字節也隱含了文檔創建的時間。絕大多數驅動都會公開一個方法從ObjectId 獲取這個信息。因為使用的是當前時間,很多用戶擔心要對服務器進行時間同步。其實沒有這個必要,因為時間戳的實際值并不重要,只要其總是不停增加就好了(每秒一次)。
接下來的3 字節是所在主機的唯一標識符。通常是機器主機名的散列值。這樣就可以確保不同主機生成不同的ObjectId,不產生沖突。
為了確保在同一臺機器上并發的多個進程產生的ObjectId 是唯一的,接下來的兩字節來自產生ObjectId 的進程標識符(PID)。
前9 字節保證了同一秒鐘不同機器不同進程產生的ObjectId 是唯一的。后3 字節就是一個自動增加的計數器,確保相同進程同一秒產生的ObjectId 也是不一樣的。同一秒鐘最多允許每個進程擁有2563(16 777 216)個不同的ObjectId。
自動生成_id前面講到,如果插入文檔的時候沒有"_id" 鍵,系統會自動幫你創建一個。可以由MongoDB 服務器來做這件事情,但通常會在客戶端由驅動程序完成。理由如下。
雖然ObjectId 設計成輕量型的,易于生成,但是畢竟生成的時候還是產生開銷。在客戶端生成體現了MongoDB 的設計理念:能從服務器端轉移到驅動程序來做的事,就盡量轉移。這種理念背后的原因是,即便是像MongoDB 這樣的可擴展數據庫,擴展應用層也要比擴展數據庫層容易得多。將事務交由客戶端來處理,就減輕了數據庫擴展的負擔。
在客戶端生成ObjectId,驅動程序能夠提供更加豐富的API。例如,驅動程序可以有自己的insert 方法,可以返回生成的ObjectId,也可以直接將其插入文檔。如果驅動程序允許服務器生成ObjectId,那么將需要多帶帶的查詢,以確定插入的文檔中的"_id" 值。
原文:2.6.6 _id和ObjectId
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18937.html
摘要:簡述與同為數據庫但是為數據庫而為文檔型數據庫存儲的是文檔的二進制化內部執行引擎為解釋器把文檔存儲成結構在查詢時轉換為對象并可以通過熟悉的語法來操作的安裝啟動在上直接下載解壓運行即可本身是已編譯好的二進制可執行文件如果報錯說明你的服務器和 簡述 mongoDB與redis同為noSql數據庫,但是redis為kv數據庫(key/value),而mongoDB為文檔型數據庫存儲的是文檔(B...
摘要:反范式化與范式化相反將每個文檔所需的數據都嵌入在文檔內部。決定何時采用范式化何時采用反范式化時比較困難的。范式化能夠提高數據寫入速度,反范式化能夠提高數據讀取速度。 原文地址:http://pwhack.me/post/2014-06-25-1 轉載注明出處 本文摘錄自《MongoDB權威指南》第八章,可以徹底回答以下兩個問題: http://segmentfault.com/...
摘要:使用可以實現在一個中填充其他的。表示關聯注意被關聯的的必須是和才有效。封裝了很多查詢的方法,使得對數據庫的操作變得簡單啦。這里分享一下方法用法。類型的時,格式如為表示不填充,為時表示填充。類型,可選,指定附加的查詢條件。 Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。 什么是ODM? 其實和ORM(Object Relational...
閱讀 3904·2021-11-22 09:34
閱讀 1490·2021-11-04 16:10
閱讀 1721·2021-10-11 10:59
閱讀 3271·2019-08-30 15:44
閱讀 2036·2019-08-30 13:17
閱讀 3445·2019-08-30 11:05
閱讀 744·2019-08-29 14:02
閱讀 2618·2019-08-26 13:34