MongoDB

1、MongoDB簡介

1NoSqlmongodb

NoSQL ,(Not Only SQL),泛指非關係型數據庫, 它是由一次叫「反Sql運動」的社區討論而誕生的體系。php

NoSql的共同特色和優點:html

NoSQL 一般是以key-value形式存儲的(如:Memcache) mysql

不支持SQL語句,linux

沒有表結構laravel

配置簡單redis

靈活、高效的操做與數據模型sql

低廉的學習成本mongodb

能很好地做爲MySql的中間層數據庫

MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的,可是mongdb作不到關係型數據的連表,外鍵等操做,它的存儲數據方式有點相似於Json格式,Mogodb叫作這種格式叫爲Bson(big json)Mongodb是一個面向集合的,模式自由的文檔型數據庫。apache

MongoDB能很好地支持PHP

MongoDB安全性是全部NOSql最好的.

MongoDB安裝的文件比較大,佔據了必定的硬盤空間

 

 

二、mongodbmysql性能比較

下面是官方的bench-mark數據測試數據:

1.分別插入100萬條記錄,並對其作100個用戶併發查詢操做,

 

 

Mongodb分片(把大數據拆分爲小數據進行復制)數據測試結論:138M/s

3、應用範圍和限制

缺點:不支持連表查詢,不支持sql語句,不支持事務存儲過程等,因此不適合存儲數據間關係比較複雜的數據,通常主要是當作一個數據倉庫來使用。

適用於:日誌系統,股票數據等。

不使用於:電子商務系統等須要連多表查詢的功能。

國內職場中應用mongodb最普遍的網站(PHP+Mongodb):

youku(優酷)

tudou(土豆)

星期五臺球網(在廣州,北京,上海,南京,臺灣,澳門,香港,美國,芬蘭,英國,澳大利亞都有分公司,這個公司的總部在新加坡)

這是一個綜合性的網站集直播,電子商務,明星代言,賽事組織,賭博娛樂,門票買賣和檯球賽事資訊於一體,是全球最大的檯球體育賽事直播網站,我國著名斯諾克選手丁俊暉和香港著名選手傅家俊也曾經是該公司的代言人.所以它是一個具備雄厚資金的實力的1個公司.它的分公司香港和澳門比較缺少PHP的技術人才,尤爲是澳門那邊通常是招聘國內這邊的技術人才,待遇很高,一個初級的PHP工程師澳門分站開出的薪資是28000元奧幣(22400RMB).稅後也可以有18000元,且有員工的公寓,辦公地點在悅榕莊大酒店(6星級)的技術開發部,包三餐且有員工宿舍(在珠海).正常是早上9點30分上班,晚上18點下班,但賽事直播期間須要凌晨上班配置公司的直播主持人相關設定和活動的開啓,這點比較辛苦.該公司的業務目前還與MMA和UFC官方合做,在不久的未來將在澳門和香港開切搏擊賽事的直播頻道,聽說會在今年12月上線,MMA和UFC是全球觀衆僅此與足球和NBA的賽事.

該公司擁有2種開發架構:ASP.NET + SQL 和 PHP + MongoDB

2、須要掌握的幾個概念

1、文檔

文檔mongoDB中數據的基本單元,相似關係數據庫的行

多個鍵值對有序地放置在一塊兒即是文檔。

 MongoDB 中以文檔的方式存取記錄,如一條記錄格式以下:

 

{ 「username」:」Tom」, 「age」:10 ,email:’xiaobai@sohu.com’,’sex’:男}

{ "username":"Tom" , "age" : "10" }

{「Username」:」Tom」,」age」:10}

{「Username」:」Tom」 }  

 

 

注意:

1)以上是幾個不一樣的文檔,MongoDB區分大小寫的數據類型,第一個age字段是數字類型,第二個age是字符串類型。

2)每個文檔最大字節大小是1M (MySql1行記錄最大字節大小也是16M)

2、集合()

集合就是一組文檔,多個文檔組成一個集合集合相似於 mysql裏面的 

無模式是指,在同一個集合中能夠包含不一樣格式的文檔,如:

{   "Name" : "Mongodb" ,  "Type" : "Nosql"  }

{   "UserName" : "Tom"  ,  "age"  :  20  ,  "Gender"  :  "male"  }

以上兩個文檔能夠放在同一個集合中。

Mysql須要先建表再插入數據,

模式自由(schema-free):意思是集合裏面沒有行和列的概念

注意:MongoDB中的集合不用建立沒有結構,因此能夠放不一樣格式的文檔。

 

3、數據庫

多個集合能夠組成數據庫。一個mongoDB實例能夠承載多個數據庫,他們之間徹底獨立。

Mongodb中的數據庫和Mysql中的數據庫概念相似,只是無需建立

一個數據庫中能夠有多個集合。

一個集合中能夠有多個文檔。

4mongodb的數據體系

 

 

 

 

3、安裝mongodb

第1步:經過yum search mongodb,查到mongodb的安裝包以下:

 

 

第2步:輸入yum -y install mongodb mongodb-server進行安裝(下載完成大概有123M)

 

 

安裝成功會出現如下界面:

 

 

 

第3步:啓動mongodb,命令:service mongod start

 

 

第4步:使用命令mongo就能夠進入mongodb數據庫的客戶端

 

 

mongodb的經典版本是2.4,最新版本是2.7,通常建議使用mongodb2.4

注意:若是但願卸載一個軟件可使用yum -y remove mongodb*

4、入門語句

1、建立數據庫和切換數據庫

語法規則:use [數據庫名稱]

好比:建立或者切換一個數據庫名爲php25

 

 

注意:若是該數據庫不存在,則建立,若是該數據庫存在,則是切換,若是建立了數據庫,沒有任何的操做,則會自動刪除該數據庫。

 

二、獲取當前數據庫名稱

語法規則:db

好比:顯示當前正在使用的數據庫名稱

 

 

三、查看當前數據庫狀態

語法規則: db.stats()

好比:若是您當前ues了一個名爲php25的數據庫,那麼db就表示爲php25,stats就能夠查看當前數據庫的狀態

 

 

 

四、查看全部的數據庫

語法規則:show dbs

好比:查看數據在mongodb裏面已經建立的數據庫

 

 空數據庫會被mongdb自動回收

 

5、建立集合

語法規則db.集合名.insert({key:value....})

好比:向php25數據庫中建立一個集合(表),建立集合必須添加一個文檔,建立集合名稱爲class1,集合中的文檔(記錄)爲name=pengjim,age=30

使用命令: db.class1.insert({name:'pengjim',age:30});

 

 

 

注意:mongodb裏面的集合是隱式建立,就是無需建立,直接使用,回車不提示任何的錯誤,那麼就表明該集合建立成功.

6、查看集合

語法規則show tables

好比:顯示當前操做的數據庫中的全部集合

 

 system.indexs是用來存放當前數據相關索引信息集合。

七、查詢集合裏面的文檔

語法規則db.集合名.find()
好比:查找一個集合中的全部數據,其實就至關於mysql數據庫中使用select * 查找表中全部的數據.

使用命令: db.class1.find()

 

 

objectIdmongodb默認產生主鍵,objectId產生的主鍵字節數很大,通常佔據了16個字節,所以不利於mongodb的數據庫文件的大小和空間節約,通常咱們會把這個Object修改成int類型進行存儲,因此主鍵是能夠自定義的,自定義的名稱必定爲_id,好比:要插入一條主鍵爲100的文檔,那麼代碼以下圖所示:

 

 

注意:若是一個_id已經存在,繼續插入重複的_id那麼Mongodb就會報錯,效果以下:

 

 

插入相同的主鍵就會報錯:

 

 

所以跟Mysql同樣Mongodb的主鍵也是某一個文檔(記錄)惟一性標識

db.集合名.findOne()查詢第一個文檔(現實開發中這個命令我很討厭)

 

 

注意:findOne永遠只會查詢集合中的第一個文檔(記錄)[不經常使用],且它的不少功能是沒有的,後面遇到再說起一下

8、刪除集合()

語法規則:db.集合名.drop()

好比:刪除一個數據庫中的集合,比如刪除mysql中的一張表

 

 

若是返回true表明刪除成功,並且刪除一個集合會把該集合裏面全部文檔都刪除了

 

9、刪除數據庫

語法規則db.dropDatabase()

好比:刪除一個已經存在的數據庫,db與您當前use的數據庫相關,若是你use了php25這個數據庫,那麼db.dropDatabase()刪除的就是php25這個數據庫

 

 

若是使用db.dropdatabase()刪除的結果以下:

 

 

 

10、幫助命令

①語法規則:db.help()

db.help()是獲取當前數據庫相關的幫助命令

 

 

好比能夠看到如下咱們試用過的命令:

 

 

語法:db.集合名.help()

獲取當前數據庫中某一指定集合的相關幫助命令

 

 

好比能夠看到如下咱們試用過的命令:

 

 

還能夠嘗試一下一些咱們沒有用過命令:

 

 

44是表明集合stu的字節數據大小

5、聚合更新操做

1插入數據且修改objectId數據類型

語法規則: db.集合名.insert({key:value})

在添加的文檔裏面,都有一個_id的鍵,值爲對象類型。

ObjectId類型: 每一個文檔都有一個_id字段,同一集合中的_id值惟一,該字段可

以是整數的數據,默認是一個ObjectId對象。

ObjectId對象數據組成:時間戳 |機器碼|PID|計數器 

_id的鍵值咱們能夠本身輸入,可是不能重複

注意:在插入數據的時候,若是_id的值重複則會報錯。

插入一個叫作風清揚(fengqingyang)的用戶,id=999,以下:

 

 

若是_Id重複了,那麼就算其餘字段信息是不同的數據記錄照樣提示失敗

 

2批量插入數據且修改_id爲整型

MongoDB當中,MongoDB支持JS的循環方式,若是但願批量插入,可使用如下方法:

 

這時咱們想知道上述批量操做是否成功,使用命令:db.class1.find()去查看

效果以下:

 

 

 

若是咱們想知道當前集合class1中有多少個文檔,那麼能夠經過help發覺到count()命令,進行嘗試就會獲得一下結果:

 

 

 

 

3、刪除文檔(刪除記錄)

語法:db.集合名.remove({條件})

注意:通常刪除須要加上條件進行刪除,若是不加條件就是刪除所有,至關於mysql當中的delete from 表名不加where條件,這樣的話,有可能會進行誤刪除

1:刪除class1集合學號爲5的文檔

使用命令: db.class1.remove({num:5});

 

 

 

2:刪除 class1集合_id小於3的文檔

若是須要知足例子2的需求,則須要使用操做符來完成

經常使用操做符:

$lt(小於<) , $lte(小於等於<=) , $gt(大於>) , $gte(大於等於>=)  

less than簡寫爲:lt,小於的意思

less than equls 簡寫爲:lte ,小於等於的意思

great than 簡寫爲:gt,大於的意思

great than equls:簡寫爲:gte,大於等於的意思

使用操做符的條件規則:db.class1.remove( {字段名:{'操做符':值}} );

記住口訣:

操做符在字段以內,修改器在字段以外,遇到{}和[]用數組來代替,遇到.用->來代替

 

 

 

 

3:刪除 class1集合_id小於或等於4的文檔

 

 

 

 

四、編輯(修改)文檔

mongodb中更新文檔主要依賴於修改器,經常使用的有兩種$set修改器和$inc修改器

①$set修改器語法:db.集合名.update({條件},{'$set':{修改的鍵:修改的新值}})

好比:把stu10(_id=10)的名字改成林志玲

 

 

執行結果以下:

 

 

若是咱們須要爲_id=10的這個學生加上一個年齡的字段(age),咱們應該如何操做呢?一樣使用$set修改器,$set修改若是修改一個已經存在的字段那麼就編輯的行爲,若是修改一個不存在的字段,那麼就是添加字段的行爲

 

 

執行結果以下:

 

 

 

②$inc修改器語法:db.集合名.update({條件},{'$inc':{修改的鍵:修改的新值}})

$inc修改通常大多數狀況下是拿來對整型進行加操做[加+,減-]

好比:對林志玲加3歲就可使用$inc修改

 

 

執行結果以下:

 

 

注意:語法的操做,操做成功是爲林志玲加3歲

好比:對林志玲作減去2歲也可使用$inc修改

 

 

執行結果以下:

 

 

注意:語法的操做,負數就是減操做,對林志玲作減去2歲

5.批量修改

mongodb當中,mongodb很特殊,它只能每一次修改一條記錄,若是修改的時候有多條記錄符修改的條件,它也只會默認修改最前面的一條,效果以下圖所示:

例子1:把_id小於或者等於10的學生的學科都改成laravel,代碼以下所示:

 

 

發覺以上的代碼沒法完成咱們的需求,這時,咱們需求使用如下格式進行批量更新

批量更新語法規則:

db.demo.update( {條件},{'$set':{字段:值}},更新的默認狀態,是否啓動批量更新);

說明:

更新的默認狀態:若是爲true默認更新1條記錄,若是有多條記錄複合更新的條件那麼就更新最前面的一條,默認爲true

是否啓動批量更新:若是是true表明啓動,若是是false就表明不啓動,默認false,不啓動

若是須要批量更新,固定語法格式以下:

db.demo.update( {條件},{'$set':{字段:值}},false,true);

好比:把_id小於或者等於10的學科所有改成YII

 

 

批量更新成功後的結果以下:

 

 

 

mongodb的聚合查詢文檔

語法:db.集合名.find({條件})

若是條件爲空至關於寫了db.集合名稱.find({}),就是查詢所有.

案例1:取出class1集合裏面第一個文檔

語法:db.集合名稱.findOne();

 

 

注意:若是您肯定所查找的記錄有且只有一條,那麼使用findOne方法的理論上效率會高於find方法,官方建議在查找一條記錄時用findOne取代find,但findOne的功能有限的.我通常用limit來代替

查看幫助能夠獲取limit的語法結構:

 

 

我的是建議用limit(1)來代替findOne

 

 

使用limit能夠獲取聚合查詢的全部功能,比findOne好用

案例2:取出class1集合裏面學號爲10的文檔

語法規則: db.集合名稱.find({條件});

 

 

 

執行結果以下:

 

 

案例3:取出class1集合中_id大於或等於6的學生

使用操做符來完成

經常使用操做符:

$lt(小於) , $lte(小於等於) , $gt(大於) , $gte(大於等於)  

less than簡寫爲:lt,小於的意思

less than equls 簡寫爲:lte ,小於等於的意思

great than 簡寫爲:gt,大於的意思

great than equls:簡寫爲:gte,大於等於的意思

語法:db.class1.find({字段名:{操做符:條件}})

 

 

假設把需求修改一下:查找_id大於或者等於6的學生,但值讀出查找的記錄的前面2條,這時需求把代碼修改爲如下這個結果:

 

 

執行結果以下:

 

 

案例4:取出class1集合姓名爲stu4只顯示姓名和學科

語法規則:db.集合名稱.find({條件},{字段:1/0});

說明:

{字段:1} : 表明只顯示該字段

{字段:0} : 表明不顯示該字段,但顯示該字段之外的全部的字段

 

 

執行結果以下:

 

 

注意:您只顯示某一字段,可是mongodb默認的主鍵_id也會跟隨一塊兒顯示

案例5:根據_id的升序或者降序去顯示學生的信息

需求1:按照學生的_id的升序,顯示前面的3個學生的文檔:

 

 

 

其實默認狀況下mongodb就是升序的排列形式,若是想正規使用排序能夠參看如下這個升序語法:

語法:db.集合名稱.find().sort({字段名:1}).limit(n);

說明:

sort({字段名:1}):1表明按照升序的順序進行排序

以上語法不省略sort的寫法以下:

 

 

正規的語法和默認的語法都是同樣的結果:

 

 

 

需求2:按照學生的_id的降序排序,顯示前面的3個學生的文檔:

語法:db.集合名稱.find().sort({字段名:-1}).limit(n);

說明:

sort({字段名:-1}):-1表明按照降序的順序進行排序

 

 

正規的語法的結果:

 

 

需求3:按照學生的_id的降序排序,每次只顯示最後一個文檔:

語法:db.集合名稱.find().sort({字段名:-1}).limit(1);

 

 

執行結果:

 

 

若是要查詢最後一個文檔(記錄),若是使用findOne沒法實現的,會出現如下的錯誤結果:

 

 

由於findOne是有限的,不能支持不少的功能,所以咱們只能使用limit去取代findOne

 

案例6:顯示class1集合中最後1個文檔,而且只顯示學科和姓名

代碼:db.class1.find({},{lesson:1,name:1}).sort({_id:-1}).limit(1);

 

 

執行結果以下:

 

 

注意:這時雖然咱們只是查找一條記錄,然而它附加條件有顯示某些字段那麼這時須要使用find方法來取代findOne

由於findOne是功能有限,若是你但願查最後一條必須使用sort,這時findOne並不能支持sort因此,你只可以用find+limit去代替findOne.

案例7class1集合當中顯示前面3條記錄,這記錄必須跳過前面2條進行顯示

語法規則:db.集合名稱.find().skip(n).limit(n)

 

 

 

 

以上的命令說明mongodb的數據庫一個自由的文檔性數據庫,所謂自由就是命令能夠隨意的組合而且能夠隨意使用命令的順序,因爲它特殊性很強烈,所以有人把這樣的命令公式稱爲聚合命令操做.

案例8:統計class2集合中文檔的個數

db.集合名.count():返回集合中有多少個文檔。

 

 

 

 

需求:要跳過前面的2條記錄,查詢跳過記錄後的總數是多少

代碼: db.stu.find().skip(2).count();

 

 

執行結果以下:

 

 

這樣的緣由是爲何呢?

發覺若是使用上述的代碼沒法完成當前的須要,緣由是mongodb沒有把skip當成一個條件來的對待,若是但願mongodb把skip當成條件來對待,那麼就須要把count設置true

代碼的改進以下:

代碼: db.stu.find().skip(2).count(true);

 

 

執行結果已願景同樣:

 

 

既然mongodb支持聚合查詢,那麼若是咱們把count(true)放在skip以前能夠嗎?

 

 

發覺結果會報錯

 

 

由於count(true)只可以往前看,而不能日後看

$or操做符

or操做符就至關於mysql中的or操做,是一個或布爾操做

語法:db.集合名稱.find({ ‘$or’:[{字段:條件},{字段:條件}....] });

例子1:查找class2當中_id=11或者name=stu17的學生記錄

 

 

執行的結果以下:

 

 

例子2:查找class2當中_id=12或者num=14或者name=18的學生記錄,而且只顯示姓名和學科

 

 

執行的結果以下:

 

 

$and操做符

and操做符就至關於mysql中的and操做,是一個與布爾操做

語法:db.集合名稱.find({'$and':[{字段:條件},{字段:條件}....] });

例子1:查找class2中_id=10而且num=10的學生信息

 

例子2:查找class2中_id=7而且num=7而且name=stu7的學生信息,只現實姓名和id

 

執行結果以下:

 

$in操做符

語法規則:db.集合名稱.find({字段名:{'$in':[in的條件]}});

例子:查找class2集合中_id分別爲11,14,15,17,18的學生信息

 

 

Mongodb的權限機制

1、權限概述

在默認狀況下mongodb默認無需任何受權就會以超級管理員的身份進入任何數據庫當中

所以咱們必須添加受權驗證方式。

 

注意:mongodb中添加管理員必須建立一個admin數據庫,這個數據庫添加的用戶數據就是mongodb中的管理員。這個數據庫默認的狀況實際上是存在但有些mongodb的版本是看不見的,這是mongodb開發者故意隱藏起來的。但若是你建立了用戶這個數據庫就隱藏不了。

二、建立超級管理員用戶

第一步: 選擇admin數據庫(若是是第一次use admin實際上是建立了admin數據庫 )

 

第二步:使用命令

若是使用db.help()能夠發現有一個方法叫addUser

 

語法:db.addUser(用戶名,密碼,是否只讀(默認爲否))

若是但願建立一個名爲root的用戶,密碼爲123456,那麼代碼以下:

 

執行結果以下所示:

 

 

第三步:若是但願查看剛纔所建立的管理員用戶,那麼須要到一個叫system.users的集合中查看

 

 

查看system.users的結果以下圖所示,查看代碼爲:db.system.users.find();

 

從上圖能夠得知,mongodb的管理員密碼是加密的,安全性較高(高於redis和memcache不少)

三、mongodb建立受權登陸驗證權限

當完成了管理員的建立後,就確保了有一個用戶能夠統一管理mongodb了,這時咱們須要關心的就是mongodb的配置了,配置受權登陸驗證的方法其實有好幾種,咱們採用方法是比較經常使用且比較傳統的,步驟以下:

 

第一步:首先退出當前的mongodb,使用exit命令(快捷鍵:ctrl+c)

 

第二步:這時其實你只是退出了登陸,但實際上mongodb仍是佔據着系統的進

使用netstat -tunpl | grep mongod會看到當前的進程佔據着27017的端口。

 

第三步:中止mongodb數據的進程,把端口終止,命令:service mongod stop

 

 

有時候在linux當中守護進程會啓動其餘的輔助進程,若是你使用溫柔虐殺的手段是沒法將其的輔助進程殺死的,zxapp這個監控進程(思科的一個監聽工具),會啓動不少輔助進程,若是但願中止監聽,必需要使用強制殺死zxappd的方法pkill zxappd,若是使用service zxappd stop則沒法殺死它的輔助進程.

 

第四步:修改mongodb的配置,使用vim /etc/mongodb.conf,使用末行模式搜索/auth,獲得的結果以下圖所示:

 

auth前面的#好去掉,這樣就打開了mongodb的受權才能登陸的驗證,但你必須確保當前是處於mongodb全部進程沒有啓動的狀況下修改了該配置,修改效果以下圖所示:

 

修改完成後,須要保存並退出(:x等同於:wq)

第五步:啓動mongodb,使用命令service mongod start

 

 

 

第六步:再次使用netstat -tunpl | grep mongod 查看進程

 

第七步:這時若是咱們不輸入用戶名和密碼就直接進入mongodb當中,你會發覺你作的一些操做會報錯,這就說明了,咱們的受權配置起了做用

 

這時咱們可使用exit退出數據,以下圖所示

第八步:是登陸的使用直接輸入用戶名和密碼,指向admin數據庫進行驗證

mongodb當中使用管理員登陸的過程叫作權限驗證的過程,若是你在admin數據庫當中添加了一個管理員,那麼權限驗證就須要發生在admin數據庫中,權限驗證的代碼以下:

mongo -u帳號 -p密碼 Mongodb的ip地址(本地使用localhost):端口(27017)/admin

 

若是不把root和密碼放到admin數據庫中進行驗證,那麼沒法正常登陸,要正常登陸必需要驗證root和密碼在admin數據庫中,編寫驗證命令以下:

mongo -uroot -p123456 localhost:27017/admin

 

進入以後,就是管理員的身份了,進行一些操做,確認無誤便可

5.修改管理員的密碼

刪除管理員通常現實當中咱們不多會這樣作,可是若是有一個員工從某一個公司離職以後,咱們須要把它擁有的帳號屏蔽,那麼我能夠採用修改密碼的方法對其進行屏蔽:

修改密碼的方法以下(若是您當前版本是經典的mongdb2.4),那麼修改密碼的方法就是addUser:【能夠新增也能夠修改】

 

若是修改密碼成功,則舊密碼沒法再次進行登陸,以下圖所示:

 

嘗試使用修改後的密碼654321登陸,就發覺成功:

 

若是在真實的開發環境中,要建議公司的老闆購買阿里云云存儲引擎版的mongodb

Mongodb 中索引和執行計劃

1創建普通索引 

語法規則:db.集合名稱.ensureIndex({字段名:1/-1});

說明:

ensureIndex({字段名:1}):表明建立一個字段爲索引,默認的狀況爲升序索引(經常使用)

ensureIndex({字段名:-1}):表明建立一個字段爲索引,默認的狀況爲降序索引(少用)

由於mongodb的索引結構分爲升序和降序兩種物理排序法,咱們只需知道就能夠了,不須要去理會

例子1:爲num字段進行普通索引的創建:

 

 

不出現任何的錯誤,就表明建立索引成功,能夠經過db.class2.getIndexes()去查看當前數據庫class2集合中的全部索引,效果以下:

 

二、惟一索引 

mongodb當中惟一索引,一般是用來作惟一性約束用的。

語法:

db.集合名.ensureIndex({name:1},{unique:true})

需求:對name字段作惟一性索引進行名稱的惟一性約束

 

 

建立完成,查看索引效果以下:

 

測試結果以下:

 

 

若是創建惟一索引成功,那麼就會重複插入失敗

若是插入的數據name=stu21,以下:

 

 

3、查看索引和執行計劃

經常使用命令:

(1)查看當前索引狀態: db.集合名.getIndexes();

2)詳情查看本次查詢使用哪一個索引和查詢數據的狀態信息。

需求:查看一個名爲mongod的用戶,而後使用執行計劃explain()方法來觀察索引是否有被使用,語法以下:

語法:db.find({條件}).explain();

在沒有創建索引的狀況下,explain()執行以下:

 

在有創建索引的狀況下,explain()執行以下:

 

5、刪除索引 

刪除單個索引

db.集合名.dropIndex({字段名:1});

 

執行結果以下:

 

 

 

刪除全部索引,可使用如下方法

db.集合名.dropIndexes();然而該方法比較危險,由於它會清除整個集合的索引(儘可能不要使用該方法)

注意:mongodb跟mysql不一樣的是,它的索引是沒有所謂原則的,由於它是nosql數據庫,它索引是否能夠被用上能夠主觀經過explain來查看,通常查詢的時候用到的查詢條件是索引均可能用的上.就算用不上索引,mongodb由於速度優越其實依然很快,現實開發當中不到過億條記錄都不須要使用mongodb的索引,由於使用索引文件的空間就會變大,但mongodb是速度很快的,所以不須要一開始就付出索引的代價

 

若是咱們在mongodb中使用in查詢,那麼in語句是否可使用上索引呢?

例子:查找num爲2,4,9,11,17,18的學生信息

 

 

 

php操做mongodbCURD

1php安裝mongodb擴展步驟

第一步:經過yum search mongodb能夠找到如下結果

 

第二步:輸入如下安裝指令,安裝php的mongodb擴展

yum install -y --enablerepo=remi --enablerepo=remi-php56 php-pecl-mongo

 

出現以上界面,表明安裝成功,而後重啓apache服務器

 

 

第三步:在瀏覽器端,查看mongodb的模塊是否安裝成功

 

出現以上界面,表明安裝成功,可是若是但願php可以成功連接mongodb必須關閉iptables和selinux,不然不會成功

 

二、使用php操做mongodb數據庫的CURD

1)鏈接mongodb服務器,並嘗試插入一條數據

代碼參看:code/connect.php下,上傳到/var/www/html下測試

口訣:遇到{}和[]用數組來代替,遇到.用->來代替

 

測試結果以下:

 

簡單理解迭代器是一個特殊的數組就能夠了,這時咱們先帶這個這個問題往前,若是返回迭代器,咱們也很難判斷當前數據的鏈接是否成功,那麼咱們可使用insert插入一條數據來測試,修改代碼以下:

 

 

 

測試結果:

 

如上執行成功,就證實php能夠成功鏈接mongodb數據庫

(2)刪除mongodb中的數據

代碼參看:code/remove.php下,上傳到/var/www/html下測試

例子1:刪除class3集合中的數據當中你年齡小於33歲的用戶

 

測試結果以下:

 

出現以上界面,表明鏈接mongdb,而且刪除數據成功

例子2:刪除class3集合中的數據當中你年齡33,35的信息

代碼參看:code/remove2.php下,上傳到/var/www/html下測試

 

執行結果以下:

 

(3)修改Mongodb中的數據

代碼參考:code/update.php下,上傳到/var/www/html下測試

例子1:修改class3當中的數據把name=itcast1修改成name=獨孤求敗

 

測試的結果以下:

 

出現以上界面,表明鏈接mongdb,而且修改數據成功

例子2:修改class2當中_id小於13的數據的lesson=laravel

 

執行結果以下所示:

 

4)查找mongodb中的數據

①查找class2全部的數據的前5條

該代碼文件位於code/find5php下,上傳到/var/www/html下測試

 

因爲返回的是一個迭代器,由於咱們須要把迭代器轉化稱爲數組形式,應該怎麼作呢?

 

把代碼修改以下:

 

把數組進行遍歷輸出:

 

 

若是不記得這個函數iterator_to_array,那麼咱們還可使用foreach來進行轉化(php5.5以上纔有效),修改代碼以下:

 

執行foreach轉化結果以下:

 

 

②按條件查找數據,查找學號大於5的學生記錄,而且只顯示前面4條,並且只顯示學科和姓名

該代碼文件位於code/findgt.php下,上傳到/var/www/html下測試

 

測試的結果以下:

 

十.使用php操做$or$and(拓展)

該代碼文件位於code/findor.php下,上傳到/var/www/html下測試

 

例子1:查找_id=17或者num=8或者name=stu6的學生

 

 

執行結果以下:

 

 

 

該代碼文件位於code/findand.php下,上傳到/var/www/html下測試

例子2:查找_id=12而且lesson=laravel的信息

 

執行結果以下:

 

十一.mongodb的分片和複製

mysql當中雖然咱們擁有索引或者sphinx進行支持,然而mysql是有瓶頸的,而且咱們mongodb是比較接近mysql,因此有時在開發當中,咱們就能夠把mongodb當成一個數據倉庫來進行對待,把一些大的數據複製到mongodb當中讓mongodb進行讀取

在默認的狀況下,mongodb若是沒有設置,那麼默認分片的大小爲16M,可是mongodb可以1秒鐘分片的數據容量爲138M,所以咱們能夠調整分片的數據大小.

monogodb進行分片是很是簡單,只須要手動在/etc/目錄下建立一個名爲mongodb.sharding的文件,並寫入如下內容便可:

 

保存並退出(:x),重啓mongod服務

 

若是沒有報錯,就證實分片的配置生效了,完成了分片設置,咱們就能夠把Mysql數據複製到Mongodb當中,編寫代碼以下:

該代碼文件位於code/copy.php下,上傳到/var/www/html下測試

 

該代碼文件位於code/readFromMysql.php下,上傳到/var/www/html下測試

 

 //用foreach轉化迭代器爲數組

 

這時假設咱們在mysql數據中添加一條數據,爲南京傳智播客中心

 

可是這時在瀏覽器訪問readFromMysql.php發覺沒有添加的數據.咱們須要更行copy.php才能夠獲取最新的數據,所以咱們須要使用crontab -e命令添加以下定時器代碼:

1步:使用whereis php命令找到php命令執行目錄

 

2步:使用crontab -e命令在vim的編輯模式下添加定時器以下:

 

 

咱們設置了mongodb一分鐘拆分數據能力爲80M,索引能夠大膽使用

相關文章
相關標籤/搜索