MongoDB學習分享 澤0715 新浪博客
一: 下載
上MongoDB官網 ,我們發現有32bit和64bit,這個就要看你係統了,不過這裏有兩點注意:
①:根據業界規則,偶數爲“穩定版”(如:1.6.X,1.8.X),奇數爲“開發版”(如:1.7.X,1.9.X),這兩個版本的區別相信大家都知道吧。
②:32bit的mongodb最大隻能存放2G的數據,64bit就沒有限制。
我這裏就下載"2.0.2版本,32bit“,ok,下載之後我就放到”E盤“,改下文件夾名字爲”mongodb“。
二:啓動
①:啓動之前,我們要給mongodb指定一個文件夾,這裏取名爲”db",用來存放mongodb的數據。(放到安裝目錄下最好)
進入命令行:進到mongodb的安裝目錄
輸入 mongod --dbpath=mongodb安裝目錄中的db目錄(剛纔自己建立的那個)
三:最後要看下是否開啓成功,mongodb採用27017端口,那麼我們就在瀏覽器裏面鍵入“http://localhost:27017/”,
打開後,mongodb告訴我們在27017上Add
1000可以用http模式查看mongodb的管理信息。
——————————————————————————————————————————————————————————————————————————————
mongodb基本操作
——————————————————————————————————————————————————————————————————————————
客戶端登陸:命令行中進入mongodb的安裝目錄
輸入 mongo
默認登陸到test數據庫
插入操作:db.person.insert({"name":"jack","age":20})
db.person.insert({"name":"joe","age":25})
查找操作
我們將數據插入後,肯定是要find出來,不然插了也白插,這裏要注意兩點:
① “_id":
這個字段是數據庫默認給我們加的GUID,目的就是保證數據的唯一性。
② 嚴格的按照Bson的形式書寫文檔,不過也沒關係,錯誤提示還是很強大的。
db.person.find({"name":"joe"})查單個
db.person.find()查所有
更新操作:
update方法的第一個參數爲“查找的條件”,第二個參數爲“更新的值”,學過C#,相信還是很好理解的。
db.person.update({"name":"joe"},{"name":"joe","age":30})
刪除操作:
remove中如果不帶參數將刪除所有數據,呵呵,很危險的操作,在mongodb中是一個不可撤回的操作,三思而後行。
db.person.remove({"name":"joe"})刪除這個
db.person.remove()刪除所有
***************************************************************************************************************************************************************************************
細說增刪查改
**********************************************************************************************************************************************************************************
看過上一篇,相信大家都會知道如何開啓mongodb了,這篇就細說下其中的增刪查改,首先當我們用上一篇同樣的方式打開mongodb,突然
傻眼了,擦,竟然開啓不了,仔細觀察“劃線區域“的信息,發現db文件夾下有一個類似的”lock
file”阻止了mongodb的開啓,接下來我們要做的就
是幹掉它,之後,開啓成功,關於mongodb的管理方式將在後續文章分享。
一: Insert操作
上一篇也說過,文檔是採用“K-V”格式存儲的,如果大家對JSON比較熟悉的話,我相信學mongodb是手到擒來,我們知道JSON裏面Value
可能是“字符串”,可能是“數組”,又有可能是內嵌的一個JSON對象,相同的方式也適合於BSON。
常見的插入操作也就兩種形式存在:“單條插入”和“批量插入”。
①
單條插入
先前也說了,mongo命令打開的是一個javascript
shell。所以js的語法在這裏面都行得通,看起來是不是很牛X。
打開命令行:鏈接客戶端
var
single={"name":"jack","password":"12345","age":20,"address":{"province":"anhui","city":"hefei"},"favourite":["apple",banana]}
db.user.insert(single)
single.name="joe"
single.age=25
single.address={"province":"jiangsu","city":"nanjiang"}
single.favourite=["money","mm"]
db.user.insert(single)
查看
db.user.find()
出來剛纔添加的兩個
② 批量插入
這玩意跟“單條插入”的差異相信大家應該知道,由於mongodb中沒有提供給shell的“批量插入方法”,沒關係,各個語言的driver都打通
了跟mongodb內部的批量插入方法,因爲該方法是不可或缺的,如果大家非要模擬下批量插入的話,可以自己寫了for循環,裏面就是insert。
二:Find操作
日常開發中,我們玩查詢,玩的最多的也就是二類:
①:
>, >=, <, <=, !=, =。
②:And,OR,In,NotIn
這些操作在mongodb裏面都封裝好了,下面就一一介紹:
<1>"$gt", "$gte",
"$lt", "$lte", "$ne", "沒有特殊關鍵字",這些跟上面是一一對應的,舉幾個例子。
db.user.find({"age":{$gt:22}})查出來大於22歲的
db.user.find({"age":{$lt:22}})查出來大於22歲的
<2> "無關鍵字“, "$or", "$in","$nin"
同樣我也是舉幾個例子
db.user.find($or:[{"address.province":"anhui"},{"address.province":"jiangsu"}])
db.user.find({address.province:{$in:'["anhui","guangdong"]}})
<3> 在mongodb中還有一個特殊的匹配,那就是“正則表達式”,這玩意威力很強的。
<4>
有時查詢很複雜,很蛋疼,不過沒關係,mongodb給我們祭出了大招,它就是$where,爲什麼這麼說,是因爲$where中的value
就是我們非常熟悉,非常熱愛的js來助我們一馬平川。
db.user.find({$where:function(){return
this.name=='jack'}})
三:Update操作
更新操作無非也就兩種,整體更新和局部更新,使用場合相信大家也清楚。
<1> 整體更新
不知道大家可還記得,我在上一篇使用update的時候,其實那種update是屬於整體更新。
var model
=db.user.findOne({"name":"jack"})
model.age=30
db.user.update({"name":"jack",model})更新了變量中國保存的model值
<2> 局部更新
有時候我們僅僅需要更新一個字段,而不是整體更新,那麼我們該如何做呢?easy的問題,mongodb中已經給我們提供了兩個
修改器: $inc 和 $set。
① $inc修改器
$inc也就是increase的縮寫,學過sql server
的同學應該很熟悉,比如我們做一個在線用戶狀態記錄,每次修改會在原有的基礎上
自增$inc指定的值,如果“文檔”中沒有此key,則會創建key,下面的例子一看就懂。
沒更新前是30
執行
db.user.update({"name":"jack"},{$inc:{"age":30}})年齡增加三十
更新後爲六十
② $set修改器
啥也不說了,直接上代碼
db.user.update({"name":"jack"},{$set:{"age":30}})更新完當前值成爲指定的值
<3> upsert操作
這個可是mongodb創造出來的“詞”,大家還記得update方法的第一次參數是“查詢條件”嗎?,那麼這個upsert操作就是說:如果我
沒有查到,我就在數據庫裏面新增一條,其實這樣也有好處,就是避免了我在數據庫裏面判斷是update還是add操作,使用起來很簡單
將update的第三個參數設爲true即可。
db.user.update({"name":"jackson"},{$inc:{"age":30}},true)執行後數據庫中多了這條記錄
<4> 批量更新
在mongodb中如果匹配多條,默認的情況下只更新第一條,那麼如果我們有需求必須批量更新,那麼在mongodb中實現也是很簡單
的,在update的第四個參數中設爲true即可。例子就不舉了。
四: Remove操作
這個操作在上一篇簡單的說過,這裏就不贅述了。
*********************************************************************************************************************************************************************************************************
細說高級操作
**********************************************************************************************************************************************************************************************************
今天跟大家分享一下mongodb中比較好玩的知識,主要包括:聚合,遊標。
一: 聚合
常見的聚合操作跟sql server一樣,有:count,distinct,group,mapReduce。
<1> count
count是最簡單,最容易,也是最常用的聚合工具,它的使用跟我們C#裏面的count使用簡直一模一樣。
db.person.find()結果爲全部數據
db.person.count()結果爲全部數據的長度
db.person.count({"age":20})結果爲年齡是20歲的人數
<2> distinct
這個操作相信大家也是非常熟悉的,指定了誰,誰就不能重複,直接上圖。
db.person.find()結果爲全部數據
db.person.distinct("age")數據爲全部的數據的單條記錄(一個記錄只有一條記錄)
<3> group
在mongodb裏面做group操作有點小複雜,不過大家對sql server裏面的group比較熟悉的話還是一眼
能看的明白的,其實group操作本質上形成了一種“k-v”模型,就像C#中的Dictionary,好,有了這種思維,
我們來看看如何使用group。
下面舉的例子就是按照age進行group操作,value爲對應age的姓名。下面對這些參數介紹一下:
key:
這個就是分組的key,我們這裏是對年齡分組。
initial:
每組都分享一個”初始化函數“,特別注意:是每一組,比如這個的age=20的value的list分享一個
initial函數,age=22同樣也分享一個initial函數。
$reduce: 這個函數的第一個參數是當前的文檔對象,第二個參數是上一次function操作的累計對象,第一次
爲initial中的{”perosn“:[]}。有多少個文檔,
$reduce就會調用多少次。
效果圖參考:(百度雲盤)group圖片.png
看到上面的結果,是不是有點感覺,我們通過age查看到了相應的name人員,不過有時我們可能有如下的要求:
①:想過濾掉age>25一些人員。
②:有時person數組裏面的人員太多,我想加上一個count屬性標明一下。
針對上面的需求,在group裏面還是很好辦到的,因爲group有這麼兩個可選參數: condition 和
finalize。
condition:
這個就是過濾條件。
finalize:這是個函數,每一組文檔執行完後,多會觸發此方法,那麼在每組集合裏面加上count也就是它的活了。
效果圖參考:(百度雲盤)group圖片2.png
<4> mapReduce
這玩意算是聚合函數中最複雜的了,不過複雜也好,越複雜就越靈活。
mapReduce其實是一種編程模型,用在分佈式計算中,其中有一個“map”函數,一個”reduce“函數。
① map:
這個稱爲映射函數,裏面會調用emit(key,value),集合會按照你指定的key進行映射分組。
② reduce:
這個稱爲簡化函數,會對map分組後的數據進行分組簡化,注意:在reduce(key,value)中的key就是
emit中的key,vlaue爲emit分組後的emit(value)的集合,這裏也就是很多{"count":1}的數組。
③ mapReduce:
這個就是最後執行的函數了,參數爲map,reduce和一些可選參數。具體看圖可知:
效果圖參考:(百度雲盤)group圖片3.png
從圖中我們可以看到如下信息:
result: "存放的集合名“;
input:傳入文檔的個數。
emit:此函數被調用的次數。
reduce:此函數被調用的次數。
output:最後返回文檔的個數。
最後我們看一下“collecton”集合裏面按姓名分組的情況。
效果圖參考:(百度雲盤)group圖片4.png
二:遊標
mongodb裏面的遊標有點類似我們說的C#裏面延遲執行,比如:
var
list=db.person.find();
針對這樣的操作,list其實並沒有獲取到person中的文檔,而是申明一個“查詢結構”,等我們需要的時候通過
for或者next()一次性加載過來,然後讓遊標逐行讀取,當我們枚舉完了之後,遊標銷燬,之後我們在通過list獲取時,
發現沒有數據返回了。
var list=db.person.find();
list.forEach(function(x){
print(x.name);
})
結果:
hxx
hxc
zjl
xx
直接輸入list沒有數據顯示
當然我們的“查詢構造”還可以搞的複雜點,比如分頁,排序都可以加進去。
var
single=db.person.find().sort({"name",1}).skip(2).limit(2);
那麼這樣的“查詢構造”可以在我們需要執行的時候執行,大大提高了不必要的花銷。
****************************************************************************************************************************************************************************************
索引操作
****************************************************************************************************************************************************************************************
今天分享下mongodb中關於索引的基本操作,我們日常做開發都避免不了要對程序進行性能優化,而程序的操作無非就是CURD,通常我們
又會花費50%的時間在R上面,因爲Read操作對用戶來說是非常敏感的,處理不好就會被人唾棄,呵呵。
從算法上來說有5種經典的查找,具體的可以參見我的算法速成系列,這其中就包括我們今天所說的“索引查找”,如果大家對sqlserver比較瞭解
的話,相信索引查找能給我們帶來什麼樣的性能提升吧。
我們首先插入10w數據,上圖說話
db.person.remove()
for(var i=0;i<10000;i++){
//(功能爲插入一萬條數據)
var rand=parseInt(i*Math.random());
db.person.insert({"name":"hxc"+i,"age":i})
}
一:性能分析函數(explain)
好了,數據已經插入成功,既然我們要做分析,肯定要有分析的工具,幸好mongodb中給我們提供了一個關鍵字叫做“explain",那麼怎麼用呢?
還是看圖,注意,這裏的name字段沒有建立任何索引,這裏我就查詢一個“name10000”的姓名。
db.person.find({"name":"hxc"+10000})查找到這個數據
db.person.find({"name":"hxc"+10000}).explain()
使用explain
結果
{
"coursor":"BasincCursor",
"nscanned":10000,
"nscannedObjets":10000,
"n":1,
"millis":114,
........
}
仔細看紅色區域,有幾個我們關心的key。
cursor:
這裏出現的是”BasicCursor",什麼意思呢,就是說這裏的查找採用的是“表掃描”,也就是順序查找,很悲催啊。
nscanned:
這裏是10w,也就是說數據庫瀏覽了10w個文檔,很恐怖吧,這樣玩的話讓人受不了啊。
n:
這裏是1,也就是最終返回了1個文檔。
millis:
這個就是我們最最最....關心的東西,總共耗時114毫秒。
二:建立索引(ensureIndex)
在10w條這麼簡單的集合中查找一個文檔要114毫秒有一點點讓人不能接收,好,那麼我們該如何優化呢?mongodb中給
我們帶來了索引查找,看看能不能讓我們的查詢一飛沖天.....
db.person.ensureIndex({"name":1})
//1表示按照name進行升序
db.person.find({"name":"hxc"+10000}).explan()//在此查看與這次查詢相關的參數
這裏我們使用了ensureIndex在name上建立了索引。”1“:表示按照name進行升序,”-1“:表示按照name進行降序。
我的神啊,再來看看這些敏感信息。
cursor:
這裏出現的是”BtreeCursor",這麼牛X,mongodb採用B樹的結構來存放索引,索引名爲後面的“name_1"。
nscanned:
我擦,數據庫只瀏覽了一個文檔就OK了。
n:
直接定位返回。
millis:
看看這個時間真的不敢相信,秒秒殺。
通過這個例子相信大家對索引也有了感官方面的認識了吧。
三:唯一索引
和sqlserver一樣都可以建立唯一索引,重複的鍵值自然就不能插入,在mongodb中的使用方法是:
db.person.ensureIndex({"name":1},{"unique":true})。
!!!!!!!!!!再執行姓名相同的數據插入時就報錯
四:組合索引
有時候我們的查詢不是單條件的,可能是多條件,比如查找出生在‘1989-3-2’名字叫‘jack’的同學,那麼我們可以建立“姓名”和"生日“
的聯合索引來加速查詢。
db.person.ensureIndex({"name":1,"birthday":1})
命令行中執行這兩句語句 可以實現組合索引
db.person.ensoureIndex({"birthday":1,"name":1})
看到上圖,大家或者也知道name跟birthday的不同,建立的索引也不同,升序和降序的順序不同都會產生不同的索引,
那麼我們可以用getindexes來查看下person集合中到底生成了那些索引。
db.person.getIndexs()
此時我們肯定很好奇,到底查詢優化器會使用哪個查詢作爲操作,呵呵,還是看看效果圖
看完上圖我們要相信查詢優化器,它給我們做出的選擇往往是最優的,因爲我們做查詢時,查詢優化器會使用我們建立的這些索引來創建查詢方案,
如果某一個先執行完則其他查詢方案被close掉,這種方案會被mongodb保存起來,當然如果非要用自己指定的查詢方案,這也是
可以的,在mongodb中給我們提供了hint方法讓我們可以暴力執行。
後面的hint語句內是自己建立的索引
db.person.find({"birthday":"1989-3-2","name":"jack"}).hint({"birthday":1,"name":1}).explain()
五: 刪除索引
可能隨着業務需求的變化,原先建立的索引可能沒有存在的必要了,可能有的人想說沒必要就沒必要唄,但是請記住,索引會降低CUD這三
種操作的性能,因爲這玩意需要實時維護,所以啥問題都要綜合考慮一下,這裏就把剛纔建立的索引清空掉來演示一下:dropIndexes的使用。
db.person.dropIndexes("name_1")
db.person.dropIndexes("name_1_birthday_1")
db.person.dropIndexes("birthday_1_name_1")
db.person.getIndexes()
**************************************************************************************************************************************************************************************************
**************************************************************************************************************************************************************************************************
主從複製
我們知道sql
server能夠做到讀寫分離,雙機熱備份和集羣部署,當然mongodb也能做到,實際應用中我們不希望數據庫採用單點部署,
如果碰到數據庫宕機或者被毀滅性破壞那是多麼的糟糕。
2: 從上面的圖形中我們可以分析出這種架構有如下的好處:
<1> 數據備份。
<2> 數據恢復。
<3> 讀寫分離。
3:下面我們就一一實踐
實際應用中我們肯定是多服務器部署,限於自己懶的裝虛擬機,就在一臺機器上實踐了。
第一步:我們把mongodb文件夾放在D盤和E盤,模擬放在多服務器上。
第二步:啓動D盤上的mongodb,把該數據庫指定爲主數據庫,其實命令很簡單:>mongodb
--dbpath='XXX' --master,
端口還是默認的27017.
第三步:同樣的方式啓動E盤上的mongodb,指定該數據庫爲從屬數據庫,命令也很簡單,當然我們要換一個端口,比如:8888。
source
表示主數據庫的地址。
>mongod
--dbpath=xxxx --port=8888 --slave --source=127.0.0.1:27017
第四步:從圖中的紅色區域我們發現了一條:“applied 1
operations"這樣的語句,並且發生的時間相隔10s,也就說明從屬數據庫每10s
就向主數據庫同步數據,同步依據也就是尋找主數據庫的”OpLog“日誌,可以在圖中紅色區域內發現”sync_pullOpLog“字樣。
接下來我們要做的就是測試,驚訝的發現數據已經同步更新,爽啊。
4:
如果我還想增加一臺從屬數據庫,但是我不想在啓動時就指定,而是後期指定,那麼mongodb可否做的到呢?答案肯定是可以的。
我們的主或者從屬數據庫中都有一個叫做local的集合,主要是用於存放內部複製信息。
好,那麼我們就試一下,我在F盤再拷貝一份mongodb的運行程序,cmd窗口好多啊,大家不要搞亂了。
輸入 mongod --dpath=F:\mongodb\db --port
5555 --slave
看上面的log,提示沒有主數據庫,沒關係,某一天我們良心發現,給他後期補貼一下,哈哈,再開一個cmd窗口,語句也就是
在sources中add一個host地址,最後發現數據也同步到127.0.0.1:5555這臺從屬數據庫中....
命令行執行如下:
use local
db.sources.insert({"host":"ip地址:端口"})
5: 讀寫分離
這種手段在大一點的架構中都有實現,在mongodb中其實很簡單,在默認的情況下,從屬數據庫不支持數據的讀取,但是沒關係,
在驅動中給我們提供了一個叫做“slaveOkay"來讓我們可以顯示的讀取從屬數據庫來減輕主數據庫的性能壓力,這裏就不演示了。
二:副本集
這個也是很牛X的主從集羣,不過跟上面的集羣還是有兩點區別的。
<1>: 該集羣沒有特定的主數據庫。
<2>:
如果哪個主數據庫宕機了,集羣中就會推選出一個從屬數據庫作爲主數據庫頂上,這就具備了自動故障恢復功能,很牛X的啊。
好,我們現在就來試一下,首先把所有的cmd窗口關掉重新來,清掉db下的所有文件。
第一步: 既然我們要建立集羣,就得取個集羣名字,這裏就取我們的公司名shopex,
--replSet表示讓服務器知道集羣下還有其他數據庫,
這裏就把D盤裏面的mongodb程序打開,端口爲2222。指定端口爲3333是shopex集羣下的另一個數據庫服務器。
mongod --dpaht=d:mongodb\db --port 2222
--replSet 集羣名字/ip:端口
示例: mongod --dpaht=d:mongodb\db
--port 2222 --replSet shopex/127.0.0.1:3333
第二步:
既然上面說3333是另一個數據庫服務器,不要急,現在就來開,這裏把E盤的mongodb程序打開。
mongod --dpaht=e:mongodb\db --port 3333
--replSet shopex/127.0.0.1:2222
第三步:
ok,看看上面的日誌紅色區域,似乎我們還沒有做完,是的,log信息告訴我們要初始化一下“副本集“,既然日誌這麼說,那我也就
這麼做,隨便連接一下哪個服務器都行,不過一定要進入admin集合。
命令行:
mongo 127.0.0.1:2222/admin
db.runCommand({"replSetInitiate":{
"_id":"shopex",
"members":[{"_id":1,"host":"127.0.0.1:2222"},{"_id":1,"host":"127.0.0.1:2222"}
]}})
第四步: 開啓成功後,我們要看看誰才能成爲主數據庫服務器,可以看到端口爲2222的已經成爲主數據庫服務器。
第五步:我們知道sql server裏面有一個叫做仲裁服務器,那麼mongodb中也是有的,跟sql
server一樣,仲裁只參與投票選舉,這裏我們
把F盤的mongodb作爲仲裁服務器,然後指定shopex集羣中的任一個服務器端口,這裏就指定2222。
mongod --dpaht=f:mongodb\db --port 4444
--replSet shopex/127.0.0.1:2222
然後我們在admin集合中使用rs.addArb()追加即可。
命令行:
mongo 127.0.0.1:2222/admin
rs.addArd("127.0.0.1:4444")
追加好了之後,我們使用rs.status()來查看下集羣中的服務器狀態,圖中我們可以清楚的看到誰是主,還是從,還是仲裁。
不是說該集羣有自動故障恢復嗎?那麼我們就可以來試一下,在2222端口的cmd服務器按Ctrl+C來KO掉該服務器,立馬我們發現
在3333端口的從屬服務器即可頂上,最後大家也可以再次使用rs.status()來看下集羣中服務器的狀態。
********************************************************************************************************************************************************************************************************************************
********************************************************************************************************************************************************************************************************************************
在mongodb裏面存在另一種集羣,就是分片技術,跟sql
server的表分區類似,我們知道當數據量達到T級別的時候,我們的磁盤,內存
就喫不消了,針對這樣的場景我們該如何應對。
一:分片
mongodb採用將集合進行拆分,然後將拆分的數據均攤到幾個片上的一種解決方案。
下面我對這張圖解釋一下:
人臉:
代表客戶端,客戶端肯定說,你數據庫分片不分片跟我沒關係,我叫你幹啥就幹啥,沒什麼好商量的。
mongos:
首先我們要了解”片鍵“的概念,也就是說拆分集合的依據是什麼?按照什麼鍵值進行拆分集合....
好了,mongos就是一個路由服務器,它會根據管理員設置的“片鍵”將數據分攤到自己管理的mongod集羣,數據
和片的對應關係以及相應的配置信息保存在"config服務器"上。
mongod:
一個普通的數據庫實例,如果不分片的話,我們會直接連上mongod。
二: 實戰
首先我們準備4個mongodb程序,我這裏是均攤在C,D,E,F盤上,當然你也可以做多個文件夾的形式。
1:開啓config服務器
先前也說了,mongos要把mongod之間的配置放到config服務器裏面,理所當然首先開啓它,我這裏就建立2222端口。
mongod --dpath=c:\mongodb\bin --port
2222
2: 開啓mongos服務器
這裏要注意的是我們開啓的是mongos,不是mongod,同時指定下config服務器,這裏我就開啓D盤上的mongodb,端口3333。
mongos --port 3333
--configdb=127.0.0.1:2222
3:啓動mongod服務器
對分片來說,也就是要添加片了,這裏開啓E,F盤的mongodb,端口爲:4444,5555。
e盤: mongod --dpath=e:\mongodb\bin --port
4444
f盤: mongod --dpath=f:\mongodb\bin
--port 5555
4: 服務配置
哈哈,是不是很興奮,還差最後一點配置我們就可以大功告成。
<1>
先前圖中也可以看到,我們client直接跟mongos打交道,也就說明我們要連接mongos服務器,然後將4444,5555的mongod
交給mongos,添加分片也就是addshard()。
命令行:
mongo 127.0.0.1:3333/admin
db.runCommand({"addshard":"127.0.0.1:4444",allowLocal:true})
回車提示ok
db.runCommand({"addshard":"127.0.0.1:5555",allowLocal:true})
回車提示ok
<2>片已經集羣了,但是mongos不知道該如何切分數據,也就是我們先前所說的片鍵,在mongodb中設置片鍵要做兩步
①:開啓數據庫分片功能,命令很簡單
enablesharding(),這裏我就開啓test數據庫。
②:指定集合中分片的片鍵,這裏我就指定爲person.name字段。
根據以上的設置
db.runCommand({"enablesharding":"test"})
db.runCommand({"shardcollection":"test.person","key":{"name":1}})
5: 查看效果
好了,至此我們的分片操作全部結束,接下來我們通過mongos向mongodb插入10w記錄,然後通過printShardingStatus命令
查看mongodb的數據分片情況。
這裏主要看三點信息:
① shards:
我們清楚的看到已經別分爲兩個片了,shard0000和shard0001。
② databases:
這裏有個partitioned字段表示是否分區,這裏清楚的看到test已經分區。
③ chunks:
這個很有意思,我們發現集合被砍成四段:
無窮小 —— jack0,jack0
——jack234813,jack234813——jack9999,jack9999——無窮大。
分區情況爲:3:1,從後面的 on
shardXXXX也能看得出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.