MongoDB簡介html
1.MongoDB
①MongoDB 是一個基於分佈式 文件存儲的NoSQL數據庫
②由C++語言編寫,運行穩定,性能高
③旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案
④官方網址:https://www.mongodb.com/python
2.MongoDB特色
①MongoDB能夠輕鬆地佈置兩個活躍集羣,但關係型不容易在兩臺服務器上同時運行單個數據庫
②MongoDB自然缺乏對事物的支持
③MongoDB並不提供主/主複製,但它支持分片linux
3.Bson和Json
①Bosn版本是Json的二進制格式,但並不意味着Bson佔用的空間就比Json小的多
②繼續使用Bson的緣由是由於MongoDB在設計上就是要求快速,而不是節省空間,若是處理數據的速度更快,存儲文檔時的一點開銷是徹底能夠接受的
③Bson更易於瀏覽(即遍歷),遍歷索引頁很是快,第二點是很容易將Bson數據快速轉化爲編程語言的原生數據格式正則表達式
4.名詞sql
SQL術語/概念mongodb |
MongoDB術語/概念shell |
解釋/說明數據庫 |
database編程 |
databasejson |
數據庫 |
table |
collection |
數據庫表/集合 |
row |
document |
數據記錄行/文檔 |
column |
field |
數據字段/域 |
index |
index |
索引 |
table joins |
錶鏈接,MongoDB不支持 |
|
primary key |
primary key |
主鍵,MongoDB自動將_id字段設置爲主鍵 |
5.MongoDB三要素:數據庫,集合,文檔
①數據庫:是一個集合的物理容器,一個數據庫中能夠包含多個文檔,一個服務器一般有多個數據庫
②集合:相似於關係數據庫中的表,儲存多個文檔,結構不固定,如能夠存儲以下文檔在一個集合中
{'name':'guojing','gender':'男'} {'name':'huangrong','age':18} {'book':'shuihuzhuan','heros':'108'}
③文檔:就是一個對象,由鍵值對組成,是Json的擴展Bson格式
{'name':'guojing','gender':'男'}
MongoDB安裝與管理
1.安裝
①下載MongoDB的版本注意,兩點注意
根據規則:偶數爲穩定版,如1.6X,奇數爲開發版,如1.7X
32bit的MongoDB最大隻能存放2G的數據,64bit就沒有限制
②到官網,選擇合適的版本下載
③解壓
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
④移動到/usr/local/目錄下
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
⑤將可執行文件添加到PATH路徑中
export PATH=/usr/local/mongodb/bin:$PATH
2.管理
①配置文件在/etc/mongod.conf,默認端口27017
②啓動
sudo service mongod start
③中止
sudo service mongod stop
④使用終端鏈接:mongo,這個shell就是mongodb的客戶端,同時也是一個js的編譯器
⑤ GUI:robomongo,解壓後在bin目錄下找到運行程序
數據庫操做
1.數據庫切換
①查看當前數據庫名稱:db
②查看全部數據庫名稱:show dbs,(列出全部在物理上存在的數據庫)
③切換數據庫:use 數據庫名稱,(若是數據庫不存在,則指向數據庫,但不建立,直到插入數據或建立集合時數據庫才被建立)
④默認的數據庫爲test,若是沒有建立新的數據庫,集合將存放在test數據庫中
2.數據庫刪除
刪除當前指向的數據庫,若是數據庫不存在,則什麼也不作
db.dropDatabase()
集合操做
1.集合建立
語法:
db.createCollection(name,option)
①name是要建立集合的名稱
②options是一個文檔,用於指定集合的配置
③選項參數是可選的,因此只須要到指定的集合名稱
例1:不限制集合的大小
db.createCollection(‘stu’)
例2:限制集合大小
db.createCollection(‘sub’,{capped:true,size:10})
參數capped:默認值爲false表示不設置上限,值爲true表示設置上限
參數size:當capped值爲true時,須要指定此參數,表示上限大小,當文檔設置上限時,會將以前的數據覆蓋,單位爲字節
2.查看當前數據庫的集合
show collections
3.刪除集合
db.集合名稱.drop()
數據類型
1. MongoDB中經常使用的幾種數據類型:
①Object ID:文檔ID
②String:字符串,最經常使用,必須是有效的UTF-8
③Boolean:存儲一個布爾值,true或false
④Integer:整數能夠是32位或64位,這取決於服務器
⑤Double:存儲浮點值
⑥Arrays:數組或列表,多個值存儲到一個鍵
⑦Object:用於嵌入式的文檔,即一個值爲一個文檔
⑧Null:存儲Null值
⑨Timestamp:時間戳
⑩Date:存儲當前日期或時間的UNIX時間格式
2. object id
①每一個文檔都有一個屬性,爲_id,保證每一個文檔的惟一性
②能夠本身去設置_id插入文檔
③若是沒有提供,那麼MongoDB爲每一個文檔提供了一個獨特的_id,類型爲objectID
④objectID是一個12字節的十六進制數
前4個字節爲當前時間戳
接下來3個字節的機器ID
接下來的2個字節中MongoDB的服務進程id
最後3個字節是簡單的增量值
數據操做
1.插入
插入文檔時,若是不指定_id參數,MongoDB會爲文檔分配一個惟一的ObjectId
db.集合名稱.insert(document)
2.簡單查詢
db.集合名稱.find()
3.更新
db.集合名稱.update(<query>,<update>,multi:<boolean>})
①參數query:查詢條件,相似sql語句update中where部分
②參數update:更新操做符,相似sql語句update中set部分
③參數multi:可選,默認是false,表示只更新找到的第一條記錄,值爲true表示把知足條件的文檔所有更新
例3:全文檔更新
db.stu.update( {name:'hr'},{name:'mnc'} )
例4:指定屬性更新,經過操做符$set
db.stu.insert({name:'hr',gender:0}) db.stu.update({name:'hr'},{$set:{name:'hys'}})
例5:修改多條匹配到的數據
db.stu.update({},{$set:{gender:0}},{multi:true})
4.保存
若是文檔的_id已經存在則修改,不存在則添加
db.集合名稱.save(document)
5.刪除
db.集合名稱.remove( <query>, { justOne: <boolean>})
①參數query:可選,刪除的文檔的條件
②參數justOne:可選,若是設爲true或1,則只刪除一條,默認false,表示刪除多條
例6:只刪除匹配到的第一條
db.stu.remove({gender:0},{justOne:true})
例7:所有刪除
db.stu.remove({})
數據查詢
1.基本查詢
①方法find():查詢
db.集合名稱.find({條件文檔})
②方法findOne():查詢,只返回第一個
db.集合名稱.findOne({條件文檔})
③方法pretty():將結果格式化
db.集合名稱.find({條件文檔}).pretty()
2.比較運算符
①等於,默認是等於判斷,沒有運算符
②小於$lt
③小於或等於$lte
④大於$gt
⑤大於或等於$gte
⑥不等於$ne
例8:查詢年齡大於或等於18的學生
db.stu.find({age:{$gte:18}})
3.邏輯運算符
①查詢時能夠有多個條件,多個條件之間須要經過邏輯運算符鏈接
②邏輯與:默認是邏輯與的關係
例9:查詢年齡大於或等於18,而且性別爲1的學生
db.stu.find({age:{$gte:18},gender:1})
邏輯或:使用$or
例10:查詢年齡大於18,或性別爲0的學生
db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})
and和or一塊兒使用
例11:查詢年齡大於18或性別爲0的學生,而且學生的姓名爲gj
db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})
4.範圍運算符
使用"$in","$nin" 判斷是否在某個範圍內
例12:查詢年齡爲1八、28的學生
db.stu.find({age:{$in:[18,28]}})
5.支持正則表達式
使用//或$regex編寫正則表達式
例13:查詢姓黃的學生
db.stu.find({name:/^黃/})db.stu.find({name:{$regex:'^黃'}})
6.自定義查詢
使用$where後面寫一個函數,返回知足條件的數據
例14:查詢年齡大於30的學生
db.stu.find({$where:function(){return this.age>20}})
7. Limit(方法limit():用於讀取指定數量的文檔)
db.集合名稱.find().limit(NUMBER)
①參數NUMBER表示要獲取文檔的條數
②若是沒有指定參數則顯示集合中的全部文檔
例15:查詢2條學生信息
db.stu.find().limit(2)
8. skip(方法skip():用於跳過指定數量的文檔)
db.集合名稱.find().skip(NUMBER)
參數NUMBER表示跳過的記錄條數,默認值爲0
例16:查詢從第3條開始的學生信息
db.stu.find().skip(2)
9.Limit與Skip一塊兒使用
方法limit()和skip()能夠一塊兒使用,不分前後順序
查詢第5至8條數據(跳取)
db.stu.find().limit(4).skip(5)db.stu.find().skip(5).limit(4)
10. 投影
在查詢到的返回結果中,只選擇必要的字段,而不是選擇一個文檔的整個字段
語法:參數爲字段與值,值爲1表示顯示,值爲0不顯示
db.集合名稱.find({},{字段名稱:1,...})
對於須要顯示的字段,設置爲1便可,不設置即爲不顯示
特殊:對於_id列默認是顯示的,若是不顯示須要明確設置爲0
db.stu.find({},{_id:0,name:1,gender:1})
11.排序
方法sort(),用於對結果集進行排序
語法:db.集合名稱.find().sort({字段:1,...})
①參數1爲升序排列
②參數-1爲降序排列
例18:根據性別降序,再根據年齡升序
db.stu.find().sort({gender:-1,age:1})
12.統計個數
方法count()用於統計結果集中文檔條數
語法:
db.集合名稱.find({條件}).count()
也能夠與爲
db.集合名稱.count({條件})
例19:統計男生人數
db.stu.find({gender:1}).count()
例20:統計年齡大於20的男生人數
db.stu.count({age:{$gt:20},gender:1})
13.消除重複
方法distinct()對數據進行去重
語法:
db.集合名稱.distinct('去重字段',{條件})
例21:查找年齡大於18的性別(去重)
db.stu.distinct('gender',{age:{$gt:18}})
聚合 aggregate
1.聚合(aggregate)
主要用於計算數據,相似sql中的sum()、avg()
語法:
db.集合名稱.aggregate([{管道:{表達式}}])
2.管道
管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的輸入
ps ajx | grep mongo
在mongodb中,管道具備一樣的做用,文檔處理完畢後,經過管道進行下一次處理
經常使用管道:
$group:將集合中的文檔分組,可用於統計結果
$match:過濾數據,只輸出符合條件的文檔
$project:修改輸入文檔的結構,如重命名、增長、刪除字段、建立計算結果
$sort:將輸入文檔排序後輸出
$limit:限制聚合管道返回的文檔數
$skip:跳過指定數量的文檔,並返回餘下的文檔
$unwind:將數組類型的字段進行拆分
表達式
處理輸入文檔並輸出
語法:表達式:'$列名'
$sum:計算總和,$sum:1同count表示計數
$avg:計算平均值
$min:獲取最小值
$max:獲取最大值
$push:在結果文檔中插入值到一個數組中
$first:根據資源文檔的排序獲取第一個文檔數據
$last:根據資源文檔的排序獲取最後一個文檔數據
3.$group
將集合中的文檔分組,可用於統計結果
_id表示分組的依據,使用某個字段的格式爲'$字段'
例22:統計男生、女生的總人數
db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}}])
Group by null
將集合中全部文檔分爲一組
例23:求學生總人數、平均年齡
db.stu.aggregate([{$group:{_id:null,counter:{$sum:1},avgAge:{$avg:'$age'} }}])
透視數據
例24:統計學生性別及學生姓名
db.stu.aggregate([{$group:{_id:'$gender',name:{$push:'$name'}}}])
使用$$ROOT能夠將文檔內容加入到結果集的數組中,代碼以下
db.stu.aggregate([{$group:{_id:'$gender',name:{$push:'$$ROOT'}}}])
4.$match
用於過濾數據,只輸出符合條件的文檔
使用MongoDB的標準查詢操做
例25:查詢年齡大於20的學生
db.stu.aggregate([{$match:{age:{$gt:20}}}])
例26:查詢年齡大於20的男生、女生人數
db.stu.aggregate([{$match:{age:{$gt:20}}},{$group:{_id:'$gender',counter:{$sum:1}}}])
5.$project
修改輸入文檔的結構,如重命名、增長、刪除字段、建立計算結果
例27:查詢學生的姓名、年齡
db.stu.aggregate([{$project:{_id:0,name:1,age:1}}])
例28:查詢男生、女生人數,輸出人數
db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$project:{_id:0,counter:1}}])
6. $sort
將輸入文檔排序後輸出
例29:查詢學生信息,按年齡升序
b.stu.aggregate([{$sort:{age:1}}])
例30:查詢男生、女生人數,按人數降序
db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}])
7. $limit,$skip
限制聚合管道返回的文檔數
例31:查詢2條學生信息
db.stu.aggregate([{$limit:2}])
$skip
跳過指定數量的文檔,並返回餘下的文檔
例32:查詢從第3條開始的學生信息
db.stu.aggregate([{$skip:2}])
例33:統計男生、女生人數,按人數升序,取第二條數據
db.stu.aggregate( [{$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:1}}, {$skip:1}, {$limit:1}])
注意順序:先寫skip,再寫limit
8. $unwind
將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值
語法1:對某字段值進行拆分
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
構造數據
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
查詢
db.t2.aggregate([{$unwind:'$size'}])
語法2:對某字段值進行拆分
處理空數組、非數組、無字段、null狀況
db.inventory.aggregate([{ $unwind:{ path:'$字段名稱', preserveNullAndEmptyArrays:<boolean>#防止數據丟失 }}])
構造數據
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:'$sizes',preserveNullAndEmptyArrays:true}}])
安全
1.超級管理員
爲了更安全的訪問mongodb,須要訪問者提供用戶名和密碼,因而須要在mongodb中建立用戶
採用了角色-用戶-數據庫的安全管理方式
經常使用系統角色以下:
root:只在admin數據庫中可用,超級帳號,超級權限
Read:容許用戶讀取指定數據庫
readWrite:容許用戶讀寫指定數據庫
建立超級管理用戶
use admindb.createUser({ user:'admin', pwd:'123', roles:[{role:'root',db:'admin'}] })
2.啓用安全認證
修改配置文件
sudo vi /etc/mongod.conf
啓用身份驗證
注意:keys and values之間必定要加空格, 不然解析會報錯
security: authorization: enabled
重啓服務
sudo service mongod stop sudo service mongod start
終端鏈接
mongo -u 'admin' -p '123' --authenticationDatabase 'admin'
3.普通用戶管理
使用超級管理員登陸,而後進入用戶管理操做
查看當前數據庫的用戶
use test1show users
建立普通用戶
db.createUser({ user:'t1', pwd:'123', roles:[{role:'readWrite',db:'test1'}] })
終端鏈接
mongo -u t1 -p 123 --authenticationDatabase test1
切換數據庫,執行命令查看效果
修改用戶:能夠修改pwd、roles屬性
db.updateUser('t1',{pwd:'456'})
複製(副本集)
1.什麼是複製
①複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提升了數據的可用性,並能夠保證數據的安全性
②複製還容許從硬件故障和服務中斷中恢復數據
2.爲何要複製
①數據備份
②數據災難恢復
③讀寫分離
④高(24* 7)數據可用性
⑤無宕機維護
⑥副本集對應用程序是透明
3.複製的工做原理
①複製至少須要兩個節點A、B...
②A是主節點,負責處理客戶端請求
③其他的都是從節點,負責複製主節點上的數據
④節點常見的搭配方式爲:一主一從、一主多從
⑤主節點記錄在其上的全部操做,從節點按期輪詢主節點獲取這些操做,而後對本身的數據副本執行這些操做,從而保證從節點的數據與主節點一致
⑥主節點與從節點進行數據交互保障數據的一致性
4.複製的特色
①N 個節點的集羣
②任何節點可做爲主節點
③全部寫入操做都在主節點上
④自動故障轉移
⑤自動恢復
5.設置複製節點
接下來的操做須要打開多個終端窗口,並且可能會鏈接多臺ubuntu主機,會顯得有些亂,建議在xshell中實現
step1:建立數據庫目錄t一、t2
在Desktop目錄下演示,其它目錄也能夠,注意權限便可
mkdir t1mkdir t2
step2:使用以下格式啓動mongod,注意replSet的名稱是一致的
mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
step3:鏈接主服務器,此處設置192.168.196.128:27017爲主服務器
mongo --host 192.168.196.128 --port 27017
step4:初始化
rs.initiate()
step5:查看當前狀態
rs.status()
step6:添加複本集
rs.add('192.168.196.128:27018')
step7:鏈接第二個mongo服務
mongo --host 192.168.196.128 --port 27018
step8:向主服務器中插入數據
use test1for(i=0;i<10;i++){ db.t1.insert({_id:i}) } db.t1.find()
step9:在從服務器中插查詢
說明:若是在從服務器上進行讀操做,須要設置rs.slaveOk()
rs.slaveOk()db.t1.find()
其它說明
刪除從節點
rs.remove('192.168.196.128:27018')
關閉主服務器後,再從新啓動,會發現原來的從服務器變爲了主服務器,新啓動的服務器(原來的從服務器)變爲了從服務器
備份和恢復
1.備份
語法:
mongodump -h dbhost -d dbname -o dbdirectory
-h:服務器地址,也能夠指定端口號
-d:須要備份的數據庫名稱
-o:備份的數據存放位置,此目錄中存放着備份出來的數據
例1:
sudo mkdir test1bak sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
2.恢復
語法:
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服務器地址
-d:須要恢復的數據庫實例
--dir:備份數據所在位置
例2:
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
與python交互
1.點擊查看官方文檔:http://api.mongodb.org/python/current/tutorial.html
2.安裝python包
進入虛擬環境
sudo pip install pymongo
或源碼安裝
python setup.py
引入包pymongo
import pymongo
鏈接,建立客戶端
client = pymongo.MongoClient("localhost", 27017)
得到數據庫test1
db = client.test1
得到集合stu
stu = db.stu
添加文檔
s1 = {name:'gj',age:18} s1_id = stu.insert_one(s1).inserted_id
查找一個文檔
s2 = stu.find_one()
查找多個文檔1
for cur in stu.find(): print cur
查找多個文檔2
cur = stu.find()cur.next()cur.next()cur.next()
獲取文檔個數
print stu.count()