前言
今天搜索spark mongo的資料,意外發(fā)現(xiàn)了MongoDB的一些知識(shí),這些都是之前沒(méi)有接觸過(guò)的,所以專(zhuān)門(mén)記錄下。 (๑• . •๑)
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
一、BSON文檔
- BSON文檔尺寸:一個(gè)document文檔最大尺寸為16M;大于16M的文檔需要存儲(chǔ)在GridFS中。
- 文檔內(nèi)嵌深度:BSON文檔的結(jié)構(gòu)(tree)深度最大為100。
二、Namespaces
- collection命名空間:.,最大長(zhǎng)度為120字節(jié)。這也限定了database和collection的名字不能太長(zhǎng)。
- 命名空間的個(gè)數(shù):對(duì)于MMAPV1引擎,個(gè)數(shù)最大為大約為24000個(gè),每個(gè)collection以及index都是一個(gè)namespace;對(duì)于wiredTiger引擎則沒(méi)有這個(gè)限制。
- namespace文件的大?。簩?duì)于MMAPV1引擎而言,默認(rèn)大小為16M,可以通過(guò)在配置文件中修改。wiredTiger不受此限制。
三、indexes
- index key:每條索引的key不得超過(guò)1024個(gè)字節(jié),如果index key的長(zhǎng)度超過(guò)此值,將會(huì)導(dǎo)致write操作失敗。
- 每個(gè)collection中索引的個(gè)數(shù)不得超過(guò)64個(gè)。
- 索引名稱:我們可以為index設(shè)定名稱,最終全名為..$,最長(zhǎng)不得超過(guò)128個(gè)字節(jié)。默認(rèn)情況下為filed名稱與index類(lèi)型的組合,我們可以在創(chuàng)建索引時(shí)顯式的指定index名字,參見(jiàn)createIndex()方法。
- 組合索引最多能包含31個(gè)field。
四、Data
- Capped Collection:如果你在創(chuàng)建“Capped”類(lèi)型的collection時(shí)指定了文檔的最大個(gè)數(shù),那么此個(gè)數(shù)不能超過(guò)2的32次方,如果沒(méi)有指定最大個(gè)數(shù),則沒(méi)有限制。
- Database Size:MMAPV1引擎而言,每個(gè)database不得持有超過(guò)16000個(gè)數(shù)據(jù)文件,即單個(gè)database的總數(shù)據(jù)量最大為32TB,可以通過(guò)設(shè)置“smallFiles”來(lái)限定到8TB。
- Data Size:對(duì)于MMAVPV1引擎而言,單個(gè)mongod不能管理超過(guò)最大虛擬內(nèi)存地址空間的數(shù)據(jù)集,比如linux(64位)下每個(gè)mongod實(shí)例最多可以維護(hù)64T數(shù)據(jù)。wiredTiger引擎沒(méi)有此限制。
- 每個(gè)Database中collection個(gè)數(shù):對(duì)于MMAPV1引擎而然,每個(gè)database所能持有的collections個(gè)數(shù)取決于namespace文件大小(用來(lái)保存namespace)以及每個(gè)collection中indexes的個(gè)數(shù),最終總尺寸不超過(guò)namespace文件的大?。?6M)。wiredTiger引擎不受到此限制。
五、Replica Sets
- 每個(gè)replica set中最多支持50個(gè)members。
- replica set中最多可以有7個(gè)voting members。(投票者)
- 如果沒(méi)有顯式的指定oplog的尺寸,其最大不會(huì)超過(guò)50G。
六、Sharded Clusters
- group聚合函數(shù),在sharding模式下不可用。請(qǐng)使用mapreduce或者aggregate方法。
- Coverd Queries:即查詢條件中的Fields必須是index的一部分,且返回結(jié)果只包含index中的fields;對(duì)于sharding集群,如果query中不包含shard key,索引則無(wú)法進(jìn)行覆蓋。雖然_id不是“shard key”,但是如果查詢條件中只包含_id,且返回的結(jié)果中也只需要_id字段值,則可以使用覆蓋查詢,不過(guò)這個(gè)查詢似乎并沒(méi)有什么意義(除非是檢測(cè)此_id的document是否存在)。
- 對(duì)于已經(jīng)存有數(shù)據(jù)的collections開(kāi)啟sharding(原來(lái)非sharding),則其最大數(shù)據(jù)不得超過(guò)256G。當(dāng)collection被sharding之后,那么它可以存儲(chǔ)任意多的數(shù)據(jù)。
- 對(duì)于sharded collection,update、remove對(duì)單條數(shù)據(jù)操作(操作選項(xiàng)為multi:false或者justOne),必須指定shard key或者_(dá)id字段;否則將會(huì)拋出error。
- 唯一索引:shards之間不支持唯一索引,除非這個(gè)“shard key”是唯一索引的最左前綴。比如collection的shard key為{“zipcode”:1,”name”: 1},如果你想對(duì)collection創(chuàng)建唯一索引,那么唯一索引必須將zipcode和name作為索引的最左前綴,比如:collection.createIndex({“zipcode”:1,”name”:1,”company”:1},{unique:true})。
- 在chunk遷移時(shí)允許的最大文檔個(gè)數(shù):如果一個(gè)chunk中documents的個(gè)數(shù)超過(guò)250000(默認(rèn)chunk大小為64M)時(shí),或者document個(gè)數(shù)大于 1.3 *(chunk最大尺寸(有配置參數(shù)決定)/ document平均尺寸),此chunk將無(wú)法被“move”(無(wú)論是balancer還是人工干預(yù)),必須等待split之后才能被move。
七、shard key
- shard key的長(zhǎng)度不得超過(guò)512個(gè)字節(jié)。
- “shard key索引”可以為基于shard key的正序索引,或者以shard key開(kāi)頭的組合索引。shard key索引不能是multikey索引(基于數(shù)組的索引)、text索引或者geo索引。
- Shard key是不可變的,無(wú)論何時(shí)都不能修改document中的shard key值。如果需要變更shard key,則需要手動(dòng)清洗數(shù)據(jù),即全量dump原始數(shù)據(jù),然后修改并保存在新的collection中。
- 單調(diào)遞增(遞減)的shard key會(huì)限制insert的吞吐量;如果_id是shard key,需要知道_id是ObjectId()生成,它也是自增值。對(duì)于單調(diào)遞增的shard key,collection上的所有insert操作都會(huì)在一個(gè)shard節(jié)點(diǎn)上進(jìn)行,那么此shard將會(huì)承載cluster的全部insert操作,因?yàn)閱蝹€(gè)shard節(jié)點(diǎn)的資源有限,因此整個(gè)cluster的insert量會(huì)因此受限。如果cluster主要是read、update操作,將不會(huì)有這方面的限制。為了避免這個(gè)問(wèn)題,可以考慮使用“hashed shard key”或者選擇一個(gè)非單調(diào)遞增key作為shard key。(rang shard key 和hashed shard key各有優(yōu)缺點(diǎn),需要根據(jù)query的情況而定)。
八、Operations
- 如果mongodb不能使用索引排序來(lái)獲取documents,那么參與排序的documents尺寸需要小于32M。
- Aggregation Pileline操作。Pipeline stages限制在100M內(nèi)存,如果stage超過(guò)此限制將會(huì)發(fā)生錯(cuò)誤,為了能處理較大的數(shù)據(jù)集,請(qǐng)開(kāi)啟“allowDiskUse”選項(xiàng),即允許pipeline stages將額外的數(shù)據(jù)寫(xiě)入臨時(shí)文件。
九、命名規(guī)則
- database的命名區(qū)分大小寫(xiě)。
- database名稱中不要包含:/ .‘'$*>:|?
- database名稱長(zhǎng)度不能超過(guò)64個(gè)字符。
- collection名稱可以以“_”或者字母字符開(kāi)頭,但是不能包含”$”符號(hào),不能為空字符或者null,不能以“system.”開(kāi)頭,因?yàn)檫@是系統(tǒng)保留字。
- document字段名不能包含“.”或者null,且不能以“$”開(kāi)頭,因?yàn)?是一個(gè)“引用符號(hào)”。
最后記錄下json嵌套中含有列表的查詢方法,樣例數(shù)據(jù):
{
"_id" : ObjectId("5c6cc376a589c200018f7312"),
"id" : "9472",
"data" : {
"name" : "測(cè)試",
"publish_date" : "2009-05-15",
"authors" : [
{
"author_id" : 3053,
"author_name" : "測(cè)試數(shù)據(jù)"
}
],
}
}
我要查詢authors中的author_id,query可以這樣寫(xiě):
db.getCollection().find({'data.authors.0.author_id': 3053})
用0來(lái)代表第一個(gè)索引,點(diǎn)代表嵌套結(jié)構(gòu)。但是spark mongo中是不能這樣導(dǎo)入的,需要使用別的方法。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- Mongodb設(shè)置TTL索引自動(dòng)清除數(shù)據(jù)與過(guò)期數(shù)據(jù)的方法
- windows與mac安裝mongodb數(shù)據(jù)庫(kù)的方法步驟與注意事項(xiàng)
- node鏈接mongodb數(shù)據(jù)庫(kù)的方法詳解【阿里云服務(wù)器環(huán)境ubuntu】
- MongoDB基礎(chǔ)入門(mén)之創(chuàng)建、刪除集合操作
- Golang Mongodb模糊查詢的使用示例
- Python使用pymongo庫(kù)操作MongoDB數(shù)據(jù)庫(kù)的方法實(shí)例
- Windows上php5.6操作mongodb數(shù)據(jù)庫(kù)示例【配置、連接、獲取實(shí)例】
- PHP封裝的簡(jiǎn)單連接MongoDB類(lèi)示例
- PHP使用mongoclient簡(jiǎn)單操作mongodb數(shù)據(jù)庫(kù)示例
- MongoDB的基本特性與內(nèi)部構(gòu)造的講解