MongoDB的學習總結

airland發表於2021-09-09

Num01-->MongoDB簡介

1、MongoDB 是一個基於分散式檔案儲存的NoSQL資料庫

2、由C++語言編寫,執行穩定,效能高

3、旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案

Num02-->MongoDB特點

1、模式自由 :可以把不同結構的文件儲存在同一個資料庫裡2、面向集合的儲存:適合儲存 JSON風格檔案的形式3、完整的索引支援:對任何屬性可索引4、複製和高可用性:支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目的是提供冗餘及自動故障轉移5、自動分片:支援雲級別的伸縮性:自動分片功能支援水平的資料庫叢集,可動態新增額外的機器6、豐富的查詢:支援豐富的查詢表達方式,查詢指令使用JSON形式的標記,可輕易查詢文件中的內嵌的物件及陣列7、快速更新:查詢最佳化器會分析查詢表示式,並生成一個高效的查詢計劃
高效的傳統儲存方式:支援二進位制資料及大型物件(如照片或圖片)

Num03-->MongoDB與SQL區別

圖片描述

這裡寫圖片描述

MongoDB三元素

三元素:資料庫,集合,文件1、資料庫:是一個集合的物理容器,一個資料庫中可以包含多個文件
一個伺服器通常有多個資料庫2、集合:類似於關聯式資料庫中的表。儲存多個文件,結構不固定,如可以儲存如下文件在一個集合中
{'name':'xiaoke','gender':'男'}
{'name':'lili','age':18}
{'book':'zhangsan,'address':'北京'}


3、文件:類似於關聯式資料庫中的行。就是一個物件,由鍵值對構成,是json的擴充套件Bson形式
{'name':'xiaoke','gender':'男'}

Num04-->MongoDB資料庫命令

1、連線成功後,預設使用test資料庫
檢視當前資料庫名稱
db

2、檢視所有資料庫名稱,列出所有在物理上存在的資料庫
show dbs

3、切換資料庫,如果資料庫不存在也並不建立,直到插入資料或建立集合時資料庫才被建立
use 資料庫名稱

4、刪除當前指向的資料庫,如果資料庫不存在,則什麼也不做
db.dropDatabase()

Num05-->MongoDB集合命令

建立語法如下:name是要建立的集合的名稱options是一個文件,用於指定集合的配置,選項引數是可選的,所以只需要到指定的集合名稱
可以不手動建立集合,向不存在的集合中第一次加入資料時,集合會被建立出來db.createCollection(name, options)

例1:不限制集合大小db.createCollection("stu")

例2:限制集合大小,後面學會插入語句後可以檢視效果
引數capped:預設值為false表示不設定上限,值為true表示設定上限

引數size:當capped值為true時,需要指定此引數,表示上限大小,當文件達到上限時,會將之前的資料覆蓋,單位為位元組db.createCollection("sub", { capped : true, size : 10 } )

檢視當前資料庫的集合show collections刪除命令db.集合名稱.drop()

Num06-->MongoDB文件命令

Test01-->MongoDB的資料型別

Object ID:文件IDString:   字串,最常用,必須是有效的UTF-8Boolean:  儲存一個布林值,true或falseInteger:  整數可以是32位或64位,這取決於伺服器
Double:   儲存浮點值
Arrays:   陣列或列表,多個值儲存到一個鍵Object:   用於嵌入式的文件,即一個值為一個文件
Null:     儲存Null值
Timestamp:時間戳,表示從1970-1-1到現在的總秒數Date:     儲存當前日期或時間的UNIX時間格式

建立日期語句如下

注意:引數的格式為YYYY-MM-DDnew Date('2015-11-11')
object id

每個文件都有一個屬性,為_id,保證每個文件的唯一性
可以自己去設定_id插入文件
如果沒有提供,那麼MongoDB為每個文件提供了一個獨特的_id,型別為objectID

objectID是一個12位元組的十六進位制數:
前4個位元組為當前時間戳
接下來3個位元組為機器ID
接下來的2個位元組為MongoDB的服務程式id
最後3個位元組為簡單的增量值

Test02-->MongoDB的資料CRDU總結

1、插入語法:
-------

db.集合名稱.insert(document)
插入文件時,如果不指定_id引數,MongoDB會為文件分配一個唯一的ObjectId
例1
db.stu.insert({name:'gj',gender:1})
例2
s1={_id:'2015111',name:'hr'}
s1.gender=0
db.stu.insert(s1)

2、更新語法:
-------

db.集合名稱.update(
   ,
   ,
   {multi: }
)
引數query:查詢條件,類似sql語句update中where部分
引數update:更新運算子,類似sql語句update中set部分
引數multi:可選,預設是false,表示只更新找到的第一條記錄,
值為true表示把滿足條件的文件全部更新
例1:全文件更新
db.stu.update({name:'hr'},{name:'mnc'})
例2:指定屬性更新,透過運算子$setdb.stu.insert({name:'hr',gender:0})
db.stu.update({name:'hr'},{$set:{name:'hys'}})
例3:修改多條匹配到的資料
db.stu.update({},{$set:{gender:0}},{multi:true})

3、儲存語法:
-------

db.集合名稱.save(document)
如果文件的_id已經存在則修改,如果文件的_id不存在則新增
例1
db.stu.save({_id:'20160102','name':'yk',gender:1})
例2
db.stu.save({_id:'20160102','name':'wyk'})

4、刪除語法:
-------

db.集合名稱.remove(
   ,
   {
     justOne: 
   }
)
引數query:可選,刪除的文件的條件
引數justOne:可選,如果設為true或1,則只刪除一條,預設false,表示刪除多條
例1:只刪除匹配到的第一條
db.stu.remove({gender:0},{justOne:true})
例2:全部刪除
db.stu.remove({})

Num07-->MongoDB資料查詢

1、基本查詢:
-------

方法find():查詢
db.集合名稱.find({條件文件})
方法findOne():查詢,只返回第一個
db.集合名稱.findOne({條件文件})
方法pretty():將結果格式化
db.集合名稱.find({條件文件}).pretty()2、比較運算子:
--------

等於,預設是等於判斷,沒有運算子
小於$lt
小於或等於$lte
大於$gt
大於或等於$gte
不等於$ne
例1:查詢名稱等於'zhangsan'的學生
db.stu.find({name:'zhangsan'})
例2:查詢年齡大於或等於18的學生
db.stu.find({age:{$gte:18}})3、邏輯運算子:
--------

查詢時可以有多個條件,多個條件之間需要透過邏輯運算子連線
邏輯與:預設是邏輯與的關係
例1:查詢年齡大於或等於18,並且性別為true的學生
db.stu.find({age:{$gte:18},gender:true})

邏輯或:使用$or,值為陣列,陣列中每個元素為json
例2:查詢年齡大於18,或性別為false的學生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})and和or一起使用
例3:查詢年齡大於18或性別為true的學生,並且學生的姓名為gj
db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})4、範圍運算子:
--------

使用"$in","$nin" 判斷是否在某個範圍內
例1:查詢年齡為18、28的學生
db.stu.find({age:{$in:[18,28]}})5、支援正規表示式:
----------

mongodb提供的終端shell,同時也是一個js的執行器,可以編寫js的程式碼和函式
使用//或$regex編寫正規表示式例1:查詢姓黃的學生
db.stu.find({name:/^黃/})
db.stu.find({name:{$regex:'^黃'}}})6、自定義查詢:
--------

使用$where後面寫一個函式(js函式),返回滿足條件的資料
例1:查詢年齡大於30的學生
db.stu.find({$where:function(){return this.age>30;}})

Num08-->MongoDB中limit與skip

limit-----

方法limit():用於讀取指定數量的文件
語法:
db.集合名稱.find().limit(NUMBER)
引數NUMBER表示要獲取文件的條數
如果沒有指定引數則顯示集合中的所有文件
例1:查詢2條學生資訊
db.stu.find().limit(2)

skip
----

方法skip():用於跳過指定數量的文件
語法:
db.集合名稱.find().skip(NUMBER)
引數NUMBER表示跳過的記錄條數,預設值為0
例1:查詢從第3條開始的學生資訊
db.stu.find().skip(2)


方法limit()和skip()可以一起使用,不分先後順序
-----------------------------

建立資料集for(i=0;i

Num09-->MongoDB投影

定義:在查詢到的返回結果中,只選擇必要的欄位,而不是選擇一個文件的整個欄位

如:一個文件有5個欄位,需要顯示只有3個,投影其中3個欄位即可
語法:
引數為欄位與值,值為1表示顯示,值為0不顯示
db.集合名稱.find({},{欄位名稱:1,...})

對於需要顯示的欄位,設定為1即可,不設定即為不顯示
特殊:對於_id列預設是顯示的,如果不顯示需要明確設定為0例1db.stu.find({},{name:1,gender:1})
例2db.stu.find({},{_id:0,name:1,gender:1})

Num10-->MongoDB排序

定義:方法sort(),用於對結果集進行排序
語法
db.集合名稱.find().sort({欄位:1,...})
引數1為升序排列
引數-1為降序排列

例1:根據性別降序,再根據年齡升序
db.stu.find().sort({gender:-1,age:1})

Num11-->MongoDB統計個數

定義:方法count()用於統計結果集中文件條數
語法
db.集合名稱.find({條件}).count()
也可以與為
db.集合名稱.count({條件})

例1:統計男生人數
db.stu.find({gender:true}).count()
例2:統計年齡大於20的男生人數
db.stu.count({age:{$gt:20},gender:true})

Num12-->MongoDB消除重複

方法distinct()對資料進行去重
語法
db.集合名稱.distinct('去重欄位',{條件})

例:查詢年齡大於18的學生,來自哪些省份
db.stu.distinct('hometown',{age:{$gt:18}})

Num13-->MongoDB聚合 aggregate

定義
--
聚合(aggregate)主要用於計算資料,類似sql中的sum()、avg()
語法:
db.集合名稱.aggregate([{管道:{表示式}}])

管道
--
管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的輸入
ps ajx | grep mongo
在mongodb中,管道具有同樣的作用,文件處理完畢後,透過管道進行下一次處理

常用管道
----$group:將集合中的文件分組,可用於統計結果$match:過濾資料,只輸出符合條件的文件$project:修改輸入文件的結構,如重新命名、增加、刪除欄位、建立計算結果$sort:將輸入文件排序後輸出$limit:限制聚合管道返回的文件數$skip:跳過指定數量的文件,並返回餘下的文件$unwind:將陣列型別的欄位進行拆分

表示式
---

處理輸入文件並輸出
語法
表示式:'$列名'常用表示式$sum:   計算總和,$sum:1同count表示計數$avg:   計算平均值$min:   獲取最小值$max:   獲取最大值$push:  在結果文件中插入值到一個陣列中$first: 根據資源文件的排序獲取第一個文件資料$last:  根據資源文件的排序獲取最後一個文件資料

Test-->unwind的深入理解

將文件中的某一個陣列型別欄位拆分成多條,每條包含陣列中的一個值

語法1---

對某欄位值進行拆分
db.集合名稱.aggregate([{$unwind:'$欄位名稱'}])
構造資料
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
查詢
db.t2.aggregate([{$unwind:'$size'}])

語法2---

對某欄位值進行拆分
處理空陣列、非陣列、無欄位、null情況
屬性preserveNullAndEmptyArrays值為false表示丟棄屬性值為空的文件
屬性preserveNullAndEmptyArrays值為true表示保留屬性值為空的文件
db.inventory.aggregate([{
    $unwind:{
        path:'$欄位名稱',
        preserveNullAndEmptyArrays:#防止資料丟失
    }
}])
構造資料
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
使用語法1查詢
db.t3.aggregate([{$unwind:'$size'}])
檢視查詢結果,發現對於空陣列、無欄位、null的文件,都被丟棄了
問:如何能不丟棄呢?
答:使用語法2查詢
db.t3.aggregate([{$unwind:{path:'$size',preserveNullAndEmptyArrays:true}}])

Num14-->MongoDB索引

在mysql中已經學習了索引,並知道索引對於查詢速度的提升
mongodb也支援索引,以提升查詢速度

步驟一:建立大量資料
在命令列中執行如下程式碼,向集合中插入10萬條文件
注意:不要在圖形介面中執行,因為軟體原因無法插入10萬條資料就會中斷執行for(i=0;i

圖片描述

這裡寫圖片描述

步驟三:建立索引
建立索引
1表示升序,-1表示降序
db.集合.ensureIndex({屬性:1})
如
db.t1.ensureIndex({name:1})

步驟四:對索引屬性查詢
執行上面的同樣的查詢,並進行查詢效能分析
db.t1.find({name:'test10000'}).explain('executionStats')
效能分析結果如下圖
索引後:

圖片描述

這裡寫圖片描述

索引的命令
建立唯一索引,實現唯一約束的功能
db.t1.ensureIndex({"name":1},{"unique":true})
聯合索引,對多個屬性建立一個索引,按照find()出現的順序
db.t1.ensureIndex({name:1,age:1})
檢視文件所有索引
db.t1.getIndexes()
刪除索引
db.t1.dropIndex('索引名稱')

Num15-->MongoDB 備份與恢復

備份
--
語法:
mongodump -h dbhost -d dbname -o dbdirectory
-h:伺服器地址,也可以指定埠號
-d:需要備份的資料庫名稱
-o:備份的資料存放位置,此目錄中存放著備份出來的資料

例1sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢復:
--
語法:
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:伺服器地址
-d:需要恢復的資料庫例項
--dir:備份資料所在位置
例1mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1



作者:曉可加油
連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2804439/,如需轉載,請註明出處,否則將追究法律責任。