MongoDB簡介
- MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫旨在為WEB應用提供可擴充套件的高效能資料庫儲存解決方案。
- 分散式演算法指的是將一個大型的任務進行分解,將每一個小任務的執行結果組合起來,返回一個整體
- 好處:給其他任務提供了可執行的機會
- MongoDB是非關係型資料庫當中功能最豐富,最像關係型資料庫的。
MongoDB優點
它的特點是高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:
- 面向集合儲存,易儲存物件型別的資料。
- 模式自由。
- 支援動態查詢。
- 支援完全索引,包含內部物件。
- 支援查詢。
- 支援複製和故障恢復。
- 使用高效的二進位制資料儲存,包括大型物件(如視訊等)。
- 自動處理碎片,以支援雲端計算層次的擴充套件性。
- 支援RUBY,PYTHON,JAVA,C++,PHP等多種語言。
- 檔案儲存格式為BSON(一種JSON的擴充套件,超集)。
BSON
-
BSON是一種類似JSON的二進位制形式的儲存格式,簡稱Binary JSON,它和JSON一樣,支援內嵌的文件物件和陣列物件,但是BSON有JSON沒有的一些資料型別,如Date和BinData型別。
-
BSON可以作為網路資料交換的一種儲存形式,這個有點類似於Google的Protocol Buffer,但是BSON是一種Schema【骨架】-less的儲存形式,它的有點是靈活性,但它的缺點是空間利用率不是很理想。
-
BSON有三個特點:輕量性、可遍歷性、高效性。
非關係型資料庫與關係型資料庫區別
非關係型資料庫的優勢:
-
效能
NOSQL是基於鍵值對的,可以想象成比表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以效能非常高。
-
可擴充套件性
同樣也是因為基於鍵值對,資料之間沒有耦合性,所以非常容易水平擴充套件。
關係型資料庫的優勢:
-
複雜查詢
可以用SQL語句方便的在多個表之間做非常複製的資料查詢。
-
事務支援
使得對於安全效能很高的資料訪問要求得以實現。
-
總結:
-
資料庫功能是用來儲存資料的。
-
資料庫分為關係型資料庫和非關係型資料庫(NoSQL)
-
關係型資料庫是由表和表之間的關係組成的,NOSQL是由集合組成的,集合下面是很多的文件。
-
非關係型資料庫檔案儲存格式為BSON(一種JSON 的擴充套件)
資料庫操作
-
顯示資料庫列表>show dbs
-
建立資料庫 >use dbname
-
顯示資料庫中的集合 >show collections
-
增加資料
db.web.save({"name":"老李"}) 建立了名為web的集合,並新增了一{"name":"老李"}的資料 db.web.insert({"name":"ghost","age":10}) 在web集合中插入一條新的資料,如果沒有web這個集合,mongodb會自動建立 save()和insert()也存在著些許區別: 若新增的資料主鍵已經存在,insert()會不做操作並提示錯誤,而save()則更改原來的內容為新內容。 _id是主鍵,主鍵是每條資料的唯一標識,不能重複,就像身份證是每個人的編號一樣。 存在資料:{ id : ObjectId("57e8d34b4764fb71d0a89caa"), " name " : " 老李"} ,id是主鍵 insert({ _id : ObjectId("57e8d34b4764fb71d0a89caa"), " name " : " 老王 " }) 會提示錯誤 複製程式碼
save(ObjectId("57e8d34b4764fb71d0a89caa"), " name " : " 老王 " }) 會把 “老李” 改為 “ 老王” ,有update的作用。 複製程式碼
-
刪除資料
- 刪除文件
- 刪除集合
- 刪除資料庫
db.users.remove({}) *刪除**users**集合下所有資料* db.users.remove({"name": "lecaf"}) *刪除**users**集合下**name=”lecaf”**的資料* db.users.drop()或db.runCommand({"drop":"users"}) *刪除集合**users* db.runCommand({"dropDatabase": 1}) *刪除當前資料庫,注意* *此處的**1**沒加雙引號。 複製程式碼
-
查詢資料
>db.users.find() 查詢users集合中所有資料
>db.users.findOne() 查詢users集合中的第一條資料
>db.users.find().pretty() 格式化查詢到的資料
複製程式碼
$gt >
$lt <
$gte >=
$lte <=
Sort 排序 db.webs.find().sort({age: -1 })
Limit 類似擷取 db.webs.find().limit( 2 )
複製程式碼
- 修改資料
db.web.update({"name":"a1"}, {$set: {sex:”women”}},true,true)
修改name=a1的資料為sex=1,
第一個引數是查詢條件,
第二個引數是修改內容,主鍵不能修改,
第三個參數列示匹配所有符合條件的資料,
第四個參數列示修改所有
複製程式碼
匹配到的資料如圖
MongoDB高階命令
- 條件查詢 歌手的json資料,我們可以把他匯入到資料庫,練習查詢命令。
語法1:db.collection.find({ "key" : value }) 查詢key=value的資料.
例1:查詢女歌星。
思路:查詢sex=”女”的歌星。
具體命令:
複製程式碼
語法2: db.collection.find({ "key" : { $gt: value } }) key > value
例2:查詢年齡大於53的歌星。
複製程式碼
語法3:db.collection.find({ "key" : { $lt: value } }) key < value
例3:查詢年齡小於35歲的歌星。
複製程式碼
語法4:db.collection.find({ "key" : { $gte: value } }) key >= value
例4:查詢成績大於等於95的歌星。
複製程式碼
語法5:db.collection.find({ "key" : { $lte: value } }) key <= value
例5:查詢年齡在小於等於32歲的歌星。
複製程式碼
語法6:db.collection.find({ "key" : { $gt: value1 , $lt: value2 } }) value1 < key <value2
例6:查詢年齡在30-40歲之間的歌星。
複製程式碼
語法7:db.collection.find({ "key" : { $ne: value } }) key <> value
例7:查詢外國歌手。
分析:條件為 country不等於”中國”
複製程式碼
語法8:db.collection.find({ "key" : { $mod : [ 10 , 1 ] } })
取模運算,條件相當於key % 10 == 1 即key除以10餘數為1的
例8:查詢成績為5 、15、25、。。。。95的歌星。
複製程式碼
語法9:db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } }) 屬於
條件相當於key等於[ 1, 2, 3 ]中任何一個.
例9:查詢序號(num)為3或者6或者9的歌星。
複製程式碼
語法10:db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } }) 不屬於
條件相當於key的值不屬於[ 1, 2, 3 ]中任何一個。
例10:查詢國籍不為美國和韓國的歌手。
複製程式碼
語法11:db.collection.find({ "key" : { $size: 1 } }) $size數量、尺寸
條件相當於key對應的值的數量是1(值必須是陣列)
這個有點難理解,通過例子理解容易些:
每個歌星都有代表作,並且代表作是陣列。
例11:查詢有3個代表作品的歌手。
複製程式碼
語法12:db.collection.find({ "key" : { $exists : true|false } })
$exists 欄位存在,true返回存在欄位key的資料,false返回不存在欄位key的資料
例12-1:查詢包含tel欄位的資料。
之前的資料欄位都是一樣的,此時插入一條資料{"name":"test","tel":"15388889999"}
然後查詢:
複製程式碼
例12-2 :查詢不包含tel欄位的資料
複製程式碼
語法13:db.collection.find({ $or : [{a : 1}, {b : 2} ] })
符合兩個條件中任意一個的資料。$or語法表示或的意思。
(注意:MongoDB 1.5.3後版本可用),符合條件a=1的或者符合條件b=2的資料都會查詢出來。
例13:
某個娛樂公司15個人,資料都在資料庫裡面,某個活動必須要劉德華參加,
另外需要團隊的全部女歌手配合演出,領導安排你幫忙列印歌手的資料。
複製程式碼
db.collection.find({ "key.subkey" :value }) 內嵌物件中的值匹配,注意:"key.subkey"必須加引號。
例14:插入一條測試資料
db.singer.insert({"name":"test2",score:{"yy":80,"sx":79,"wy":95}})
此資料的score對應的值是一個物件。
例14:查詢語文成績為80的同學。
複製程式碼
2. 排序
db.collection.find().sort({ "key1" : -1 ,"key2" : 1 }) 這裡的1代表升序,-1代表降序
例1:對所有歌星安年齡排序。
複製程式碼
3. 索引
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取資料時必須掃描集合中的每個檔案並選取那些符合查詢條件的記錄。 這種掃描全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的效能是非常致命的。 索引是特殊的資料結構,索引儲存在一個易於遍歷讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構
例如:我們查詢張三的時候 db.singer.find({"name":"張三"}) 如果沒有對name 欄位建立索引,資料庫在查詢的時候會掃描所有的資料,如果資料量小的時候,感覺不出來速度慢,當資料越來越多的時候,就會越來越慢。 這個時候如果給name 建立一個索引,查詢速度就會加快。 MongoDB使用 ensureIndex() 方法來建立索引。ensureIndex()方法基本語法格式如下所示:
>db.COLLECTION_NAME.ensureIndex({KEY:1})
對name 欄位建立一個索引如下:
複製程式碼
視覺化工具裡面可以看到剛建立的索引:
語法中 Key 值為你要建立的索引欄位,1為指定按升序建立索引,如果你想按降序來建立索引指定為-1即可。
例項
>db.col.ensureIndex({"title":1})>
ensureIndex() 方法中你也可以設定使用多個欄位建立索引(關係型資料庫中稱作複合索引)。
> db.col.ensureIndex({"title":1,"description":-1})
複製程式碼
- 其他
db.collection.find().limit(5) 控制返回結果數量,如果引數是0,則沒有約束,limit()將不起作用
複製程式碼
db.collection.find().skip(5) 控制返回結果跳過多少數量,如果引數是0,則當作沒有約束,skip()將不起作用,或者說跳過了0條
db.collection.find().skip(5).limit(5) 可用來做分頁,跳過5條資料再取5條資料
db.collection.find().count() count()返回結果集的條數
db.collection.find().skip(5).limit(5).count(true)
在加入skip()和limit()這兩個操作時,
要獲得實際返回的結果數,需要一個引數true,
否則返回的是符合查詢條件的結果總數
模糊查詢:
db.collection.find({"name":/ab/})
複製程式碼
以上是常見的查詢,如果工作中遇到更加複雜的需求,可以通過查文件來解決。