mogodb 緩存

一、mogodb的認識

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

1.mongodb與 mysql性能比較

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

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

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

2.應用範圍和限制

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

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

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

國內職場中應用mongodb最廣泛的網站(PHP+Mongodb):youku,tudou,星期五臺球網

 

二、需要掌握的幾個概念

1、文檔

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

多個鍵值對有序地放置在一起便是文檔。

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

{ “username”:”Tom”, “age”:10 ,email:’[email protected]’,’sex’:男}

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

{“Username”:”Tom”,”age”:10}

{“Username”:”Tom” }

注意:

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

(2)每一個文檔尺寸不能超過16M 

2、集合

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

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

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

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

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

在Mysql需要先建表再插入數據, 

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

注意:MongoDB中的集合不用創建沒有結構,所以可以放不同格式的文檔。

3、數據庫

多個集合可以組成數據庫。一個mongoDB實例可以承載多個數據庫,他們之間完全獨立。 

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

一個數據庫中可以有多個集合。

一個集合中可以有多個文檔。

4、mongodb的數據體系

三、安裝mongodb

1.安裝步驟

第一步:通過yum search mongodb,查到mongodb的安裝包如下:

第二步:輸入yum -y install mongodb mongodb-server進行安裝(下載完成大概有123M),安裝成功如下圖;

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

第四步:使用命令mongo就可以進入mongodb數據庫的客戶端

四、入門語句

1、創建數據庫

語法: use  數據庫名稱

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

2.獲取當前數據庫名稱

語法:db

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

3.查看當前數據庫狀態

語法: db.stats();

db一般跟您當前所有use的數據庫名稱一致,比如說,如果您當前ues了一個名爲itheima的數據庫,那麼db就表示爲itheima,stats就可以查看當前數據庫的狀態。

4.查看所有的數據庫

語法:show dbs;

查看數據在mongodb裏面已經創建的數據庫

5、創建集合

注意:mongodb裏面的集合是隱式創建,就是無需創建,直接使用。

語法:db.集合名.insert({})該語法意思是,向集合裏面,添加文檔。

回車不提示任何的錯誤,那麼就代表該集合創建成功

6、查看集合

語法:show tables

顯示當前操作的數據庫中的所有集合

顯示當前數據庫的所有集合,當前數據庫如果是itheima則顯示itheima數據庫的所有集合,如果當前的數據庫是demo那麼就顯示demo數據庫的所有集合。

7、查詢集合裏面的文檔

語法:

db.集合名.find()  查詢所有

db:代表了當前的數據庫

db.itcast:代表當前數據庫一個 名爲itcast的表名或者集合名

find:查找db.itcast集合中所有的文檔(記錄)。

mongodb默認產生主鍵,是一種objectid的對象類型。

objectId是mongodb默認產生主鍵,然而該主鍵是可以自定義的,自定義的名稱一定爲_id

比如:要插入一條主鍵爲100的文檔,那麼代碼如下圖所示:

db.itcast.insert({_id:100,name:’jimmy’});

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

因此跟Mysql一樣Mongodb的主鍵也是某一個文檔(記錄)唯一性標識

db.集合名.findOne()   查詢第一個文檔

注意:findOne永遠只會查詢集合中的第一個文檔(記錄)

8、刪除集合

語法:db.集合名.drop();

如果返回true代表刪除成功,而且刪除一個集合會把該集合裏面所有文檔都刪除了

9、刪除數據庫

語法:db.dropDatabase()

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

刪除的結果如下:

10、幫助命令

全局幫助命令

語法:help

數據庫相關的幫助命令

語法:db.help()

集合相關的幫助命令

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

五、聚合更新操作

1、添加文檔記錄

語法: db.集合名.insert({k1:’v1’,k2:’v2’…..})

在mongodb數據是一定以Bson的格式存放在文檔中的,而文檔一定是出現在集合中的添加文檔的數據類型是很自由的

加完文檔後,不過您是否願意,mongodb都會爲該文檔添加一個默認的主鍵objectId,所以你可以看一下結果:

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

ObjectId類型:

每個文檔都有一個_id字段,並且同一集合中的_id值唯一,該字段可

以是任意類型的數據,默認是一個ObjectId對象

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

_id的鍵值我們可以自己輸入,但是不能重複

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

由於_id等於100的主鍵 已經存在,所以重複插入該主鍵的值就會發生錯誤

可以使用js代碼來完成批量插入文檔。

for(var i=1;i<=2000;i++){

db.stu.insert( {name:”stu”+i,number:i} );

}

這時我們想知道上述批量操作是否成功,那麼我們需要去統計一下插入的結果,然而我們不知道怎麼樣才能查看統計的結果的方法,我們可以使用db.集合名稱.help()獲取幫助,效果如下:

於是測試的結果如下:

db.stu.find().count();

繼續查看幫助,發覺有一個方法叫db.集合名稱.find().limit(n)

於是測試的結果如下:

db.stu.find().limit(10)

2、刪除文檔

語法:db.集合名.remove({條件})(不寫條件刪除所有的文檔) 

注意:一般刪除最後加上條件進行刪除,如果不加條件就是刪除全部,相當於mysql當中的

delete from 表名,這樣的話,有可能會進行誤刪除

例1:刪除stu集合中學號等於5的文檔 

命令: db.stu.remove({number:5}),測試結果如下:

如果忘記錄刪除的命令,我們可以通過db.集合名稱.help()查找你直覺可以刪除的方法

例2:刪除 stu集合學號小於7的文檔 

使用操作符來完成

常用操作符:

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

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

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

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

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

語法:db.stu.remove( {字段名:{條件}} );

代碼: db.stu.remove( {number:{‘$lt’:7}} );

  1. 更新文檔

1.使用set修改器修改文檔

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

比如:把MeggieQ的名字改爲Meggie Lee

2.

使用inc修改器修改文檔

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

inc修改一般大多數情況下是拿來對整形進行加操作

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

比如:對林志玲做減去2歲也可以使用inc修改

4.批量更新

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

需求:把年齡18歲的人的學科都改爲thinkphp,代碼如下所示:

db.demo.update( {age:18},{'$set':{lesson:'thinkphp'}} );

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

 

語法:

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

說明:

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

是否啓動批量更新:如果是true代表啓動,如果是false就代表不啓動,默認false

如果需要批量更新,語法格式如下:

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

比如:把年齡爲18歲的學生的學科全部改爲laravel

db.demo.update( {age:18},{'$set':{lesson:'laravel'}},false,true );

mongodb的聚合查詢文檔

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

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

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

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

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

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

注意:如果您確定所查找的記錄有且只有一條,那麼使用findOne方法的效率會高於find方法,因此建議在查找一條記錄時用findOne取代find

 

案例3:取出stu集合中學號大於或等於1997的學生

使用操作符來完成

常用操作符:

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

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

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

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

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

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

代碼:db.stu.find( {number:{'$gte':1997}} );

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

代碼:db.stu.find( {number:{'$gte':1997}} ).limit(2)

假設再把需求修改一下:查找學號大於或者等於1000的學生,這時由於查找的學生有可能是很多的,這時我可能只想知道學號大於或者等於1000的學生有多少人,這時需求代碼應該修改成以下這種結果:

代碼:db.stu.find( {number:{'$gte':1000}} ).count();

案例4:取出stu集合中名爲stu999的信息記錄,且只顯示其姓名

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

說明:

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

{字段:0} : 代表不限該字段,但顯示該字段以外的所有的字段

代碼:db.stu.find({name:’stu999’},{name:1})

注意:您只顯示某一字段,但是mongodb默認的主鍵objectId也會跟隨一起顯示

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

假設把需求修改爲:查找一條名爲stu999的學生,只顯示其學號,我們可以有兩種方法對其進行顯示

代碼:db.stu.findOne({name:’stu999’},{name:0})

代碼:db.stu.findOne({name:’stu999’},{number:1}),該代碼是最精準的方法

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章