一、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.使用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}),該代碼是最精準的方法