摘要:和中存儲(chǔ)的文檔必須有一個(gè)鍵。這是的創(chuàng)建方式導(dǎo)致的。由于時(shí)間戳在前,這意味著大致會(huì)按照插入的順序排列。前字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的是唯一的。如果驅(qū)動(dòng)程序允許服務(wù)器生成,那么將需要多帶帶的查詢,以確定插入的文檔中的值。
_id和ObjectId
MongoDB 中存儲(chǔ)的文檔必須有一個(gè)"_id" 鍵。這個(gè)鍵的值可以是任何類型的,默認(rèn)是個(gè)ObjectId 對(duì)象。在一個(gè)集合里面,每個(gè)文檔都有唯一的"_id" 值,來(lái)確保集合里面每個(gè)文檔都能被唯一標(biāo)識(shí)。如果有兩個(gè)集合的話,兩個(gè)集合可以都有一個(gè)值為123 的"_id" 鍵,但是每個(gè)集合里面只能有一個(gè)"_id" 是123 的文檔。
ObjectIdObjectId 是"_id" 的默認(rèn)類型。它設(shè)計(jì)成輕量型的,不同的機(jī)器都能用全局唯一的同種方法方便地生成它。這是MongoDB 采用ObjectId,而不是其他比較常規(guī)的做法(比如自動(dòng)增加的主鍵)的主要原因,因?yàn)樵诙鄠€(gè)服務(wù)器上同步自動(dòng)增加主鍵值既費(fèi)力還費(fèi)時(shí)。MongoDB 從一開(kāi)始就設(shè)計(jì)用來(lái)作為分布式數(shù)據(jù)庫(kù),處理多個(gè)節(jié)點(diǎn)是一個(gè)核心要求。后面會(huì)看到ObjectId 類型在分片環(huán)境中要容易生成得多。
ObjectId 使用12 字節(jié)的存儲(chǔ)空間,每個(gè)字節(jié)兩位十六進(jìn)制數(shù)字,是一個(gè)24 位的字符串。由于看起來(lái)很長(zhǎng),不少人會(huì)覺(jué)得難以處理。但關(guān)鍵是要知道這個(gè)長(zhǎng)長(zhǎng)的ObjectId 是實(shí)際存儲(chǔ)數(shù)據(jù)的兩倍長(zhǎng)。
如果快速連續(xù)創(chuàng)建多個(gè)ObjectId,會(huì)發(fā)現(xiàn)每次只有最后幾位數(shù)字有變化。另外,中間的幾位數(shù)字也會(huì)變化(要是在創(chuàng)建的過(guò)程中停頓幾秒鐘)。這是ObjectId 的創(chuàng)建方式導(dǎo)致的。12 字節(jié)按照如下方式生成:
前4 個(gè)字節(jié)是從標(biāo)準(zhǔn)紀(jì)元開(kāi)始的時(shí)間戳,單位為秒。這會(huì)帶來(lái)一些有用的屬性。時(shí)間戳,與隨后的. 5 個(gè)字節(jié)組合起來(lái),提供了秒級(jí)別的唯一性。由于時(shí)間戳在前,這意味著ObjectId 大致會(huì)按照插入的順序排列。這對(duì)于某些方面很有用,如將其作為索引提高效率,但是這個(gè)是沒(méi)有保證的,僅僅是“大致”。這4 個(gè)字節(jié)也隱含了文檔創(chuàng)建的時(shí)間。絕大多數(shù)驅(qū)動(dòng)都會(huì)公開(kāi)一個(gè)方法從ObjectId 獲取這個(gè)信息。因?yàn)槭褂玫氖钱?dāng)前時(shí)間,很多用戶擔(dān)心要對(duì)服務(wù)器進(jìn)行時(shí)間同步。其實(shí)沒(méi)有這個(gè)必要,因?yàn)闀r(shí)間戳的實(shí)際值并不重要,只要其總是不停增加就好了(每秒一次)。
接下來(lái)的3 字節(jié)是所在主機(jī)的唯一標(biāo)識(shí)符。通常是機(jī)器主機(jī)名的散列值。這樣就可以確保不同主機(jī)生成不同的ObjectId,不產(chǎn)生沖突。
為了確保在同一臺(tái)機(jī)器上并發(fā)的多個(gè)進(jìn)程產(chǎn)生的ObjectId 是唯一的,接下來(lái)的兩字節(jié)來(lái)自產(chǎn)生ObjectId 的進(jìn)程標(biāo)識(shí)符(PID)。
前9 字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的ObjectId 是唯一的。后3 字節(jié)就是一個(gè)自動(dòng)增加的計(jì)數(shù)器,確保相同進(jìn)程同一秒產(chǎn)生的ObjectId 也是不一樣的。同一秒鐘最多允許每個(gè)進(jìn)程擁有2563(16 777 216)個(gè)不同的ObjectId。
自動(dòng)生成_id前面講到,如果插入文檔的時(shí)候沒(méi)有"_id" 鍵,系統(tǒng)會(huì)自動(dòng)幫你創(chuàng)建一個(gè)??梢杂蒑ongoDB 服務(wù)器來(lái)做這件事情,但通常會(huì)在客戶端由驅(qū)動(dòng)程序完成。理由如下。
雖然ObjectId 設(shè)計(jì)成輕量型的,易于生成,但是畢竟生成的時(shí)候還是產(chǎn)生開(kāi)銷。在客戶端生成體現(xiàn)了MongoDB 的設(shè)計(jì)理念:能從服務(wù)器端轉(zhuǎn)移到驅(qū)動(dòng)程序來(lái)做的事,就盡量轉(zhuǎn)移。這種理念背后的原因是,即便是像MongoDB 這樣的可擴(kuò)展數(shù)據(jù)庫(kù),擴(kuò)展應(yīng)用層也要比擴(kuò)展數(shù)據(jù)庫(kù)層容易得多。將事務(wù)交由客戶端來(lái)處理,就減輕了數(shù)據(jù)庫(kù)擴(kuò)展的負(fù)擔(dān)。
在客戶端生成ObjectId,驅(qū)動(dòng)程序能夠提供更加豐富的API。例如,驅(qū)動(dòng)程序可以有自己的insert 方法,可以返回生成的ObjectId,也可以直接將其插入文檔。如果驅(qū)動(dòng)程序允許服務(wù)器生成ObjectId,那么將需要多帶帶的查詢,以確定插入的文檔中的"_id" 值。
原文:2.6.6 _id和ObjectId
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/18937.html
摘要:簡(jiǎn)述與同為數(shù)據(jù)庫(kù)但是為數(shù)據(jù)庫(kù)而為文檔型數(shù)據(jù)庫(kù)存儲(chǔ)的是文檔的二進(jìn)制化內(nèi)部執(zhí)行引擎為解釋器把文檔存儲(chǔ)成結(jié)構(gòu)在查詢時(shí)轉(zhuǎn)換為對(duì)象并可以通過(guò)熟悉的語(yǔ)法來(lái)操作的安裝啟動(dòng)在上直接下載解壓運(yùn)行即可本身是已編譯好的二進(jìn)制可執(zhí)行文件如果報(bào)錯(cuò)說(shuō)明你的服務(wù)器和 簡(jiǎn)述 mongoDB與redis同為noSql數(shù)據(jù)庫(kù),但是redis為kv數(shù)據(jù)庫(kù)(key/value),而mongoDB為文檔型數(shù)據(jù)庫(kù)存儲(chǔ)的是文檔(B...
摘要:反范式化與范式化相反將每個(gè)文檔所需的數(shù)據(jù)都嵌入在文檔內(nèi)部。決定何時(shí)采用范式化何時(shí)采用反范式化時(shí)比較困難的。范式化能夠提高數(shù)據(jù)寫(xiě)入速度,反范式化能夠提高數(shù)據(jù)讀取速度。 原文地址:http://pwhack.me/post/2014-06-25-1 轉(zhuǎn)載注明出處 本文摘錄自《MongoDB權(quán)威指南》第八章,可以徹底回答以下兩個(gè)問(wèn)題: http://segmentfault.com/...
摘要:表達(dá)式是無(wú)狀態(tài)的,只能用于計(jì)算當(dāng)前聚合管道的文檔,不能處理其它的文檔??梢杂脕?lái)重命名增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔用于過(guò)濾數(shù)據(jù),只輸出符合條件的文檔。 1.下載安裝 1.1.首先去官網(wǎng)下載mongodb對(duì)應(yīng)版本安裝https://www.mongodb.com/download-center ?????解壓到目錄 例如:c:/mongo ?????創(chuàng)建文件夾用于m...
摘要:使用可以實(shí)現(xiàn)在一個(gè)中填充其他的。表示關(guān)聯(lián)注意被關(guān)聯(lián)的的必須是和才有效。封裝了很多查詢的方法,使得對(duì)數(shù)據(jù)庫(kù)的操作變得簡(jiǎn)單啦。這里分享一下方法用法。類型的時(shí),格式如為表示不填充,為時(shí)表示填充。類型,可選,指定附加的查詢條件。 Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。 什么是ODM? 其實(shí)和ORM(Object Relational...
閱讀 4090·2021-11-22 09:34
閱讀 1564·2021-11-04 16:10
閱讀 1794·2021-10-11 10:59
閱讀 3332·2019-08-30 15:44
閱讀 2103·2019-08-30 13:17
閱讀 3535·2019-08-30 11:05
閱讀 802·2019-08-29 14:02
閱讀 2672·2019-08-26 13:34