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也能看得出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章