Mongodb使用手冊

簡介

MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的NoSQL數(shù)據(jù)庫

由C++語言編寫蕴坪,運(yùn)行穩(wěn)定逆趋,性能高

旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案

查看官方網(wǎng)站

MongoDB特點(diǎn)

模式自由 :可以把不同結(jié)構(gòu)的文檔存儲(chǔ)在同一個(gè)數(shù)據(jù)庫里

面向集合的存儲(chǔ):適合存儲(chǔ) JSON風(fēng)格文件的形式

完整的索引支持:對任何屬性可索引

復(fù)制和高可用性:支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目的是提供冗余及自動(dòng)故障轉(zhuǎn)移

自動(dòng)分片:支持云級別的伸縮性:自動(dòng)分片功能支持水平的數(shù)據(jù)庫集群赞赖,可動(dòng)態(tài)添加額外的機(jī)器

豐富的查詢:支持豐富的查詢表達(dá)方式肢簿,查詢指令使用JSON形式的標(biāo)記唐含,可輕易查詢文檔中的內(nèi)嵌的對象及數(shù)組

快速就地更新:查詢優(yōu)化器會(huì)分析查詢表達(dá)式吮便,并生成一個(gè)高效的查詢計(jì)劃

高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對象(如照片或圖片)


基本操作

MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成

MongoDB文檔類似于JSON對象镜粤,字段值可以包含其他文檔捏题、數(shù)組、文檔數(shù)組

安裝管理mongodb環(huán)境

完成數(shù)據(jù)庫肉渴、集合的管理

數(shù)據(jù)的增加公荧、修改、刪除同规、查詢

名詞

SQL術(shù)語/概念MongoDB術(shù)語/概念解釋/說明

databasedatabase數(shù)據(jù)庫

tablecollection數(shù)據(jù)庫表/集合

rowdocument數(shù)據(jù)記錄行/文檔

columnfield數(shù)據(jù)字段/域

indexindex索引

table joins?表連接,MongoDB不支持

primary keyprimary key主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵

三元素:數(shù)據(jù)庫循狰,集合窟社,文檔

集合就是關(guān)系數(shù)據(jù)庫中的表

文檔對應(yīng)著關(guān)系數(shù)據(jù)庫中的行

文檔,就是一個(gè)對象绪钥,由鍵值對構(gòu)成灿里,是json的擴(kuò)展Bson形式

{'name':'guojing','gender':'男'}

集合:類似于關(guān)系數(shù)據(jù)庫中的表,儲(chǔ)存多個(gè)文檔程腹,結(jié)構(gòu)不固定匣吊,如可以存儲(chǔ)如下文檔在一個(gè)集合中

{'name':'guojing','gender':'男'}

{'name':'huangrong','age':18}

{'book':'shuihuzhuan','heros':'108'}

數(shù)據(jù)庫:是一個(gè)集合的物理容器,一個(gè)數(shù)據(jù)庫中可以包含多個(gè)文檔

一個(gè)服務(wù)器通常有多個(gè)數(shù)據(jù)庫


安裝

下載mongodb的版本寸潦,兩點(diǎn)注意

根據(jù)業(yè)界規(guī)則色鸳,偶數(shù)為穩(wěn)定版,如1.6.X见转,奇數(shù)為開發(fā)版命雀,如1.7.X

32bit的mongodb最大只能存放2G的數(shù)據(jù),64bit就沒有限制

到官網(wǎng)斩箫,選擇合適的版本下載

解壓

tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz

移動(dòng)到/usr/local/目錄下

sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb

將可執(zhí)行文件添加到PATH路徑中

export PATH=/usr/local/mongodb/bin:$PATH

管理mongo

配置文件在/etc/mongod.conf

默認(rèn)端口27017

啟動(dòng)

sudo service mongod start

停止

sudo service mongod stop

使用終端連接

這個(gè)shell就是mongodb的客戶端吏砂,同時(shí)也是一個(gè)js的編譯器

mongo

命令

db查看當(dāng)前數(shù)據(jù)庫名稱

db.stats()查看當(dāng)前數(shù)據(jù)庫信息

終端退出連接

exit

或ctrl+c

GUI:robomongo,解壓后在bin目錄下找到運(yùn)行程序

數(shù)據(jù)庫切換

查看當(dāng)前數(shù)據(jù)庫名稱

db

查看所有數(shù)據(jù)庫名稱

列出所有在物理上存在的數(shù)據(jù)庫

show dbs

切換數(shù)據(jù)庫

如果數(shù)據(jù)庫不存在乘客,則指向數(shù)據(jù)庫狐血,但不創(chuàng)建,直到插入數(shù)據(jù)或創(chuàng)建集合時(shí)數(shù)據(jù)庫才被創(chuàng)建

use 數(shù)據(jù)庫名稱

默認(rèn)的數(shù)據(jù)庫為test寨典,如果你沒有創(chuàng)建新的數(shù)據(jù)庫氛雪,集合將存放在test數(shù)據(jù)庫中

數(shù)據(jù)庫刪除

刪除當(dāng)前指向的數(shù)據(jù)庫

如果數(shù)據(jù)庫不存在房匆,則什么也不做

db.dropDatabase()


集合創(chuàng)建

語法

db.createCollection(name, options)

name是要?jiǎng)?chuàng)建的集合的名稱

options是一個(gè)文檔耸成,用于指定集合的配置

選項(xiàng)??參數(shù)是可選的,所以只需要到指定的集合名稱浴鸿。以下是可以使用的選項(xiàng)列表:

例1:不限制集合大小

db.createCollection("stu")

例2:限制集合大小井氢,后面學(xué)會(huì)插入語句后可以查看效果

參數(shù)capped:默認(rèn)值為false表示不設(shè)置上限,值為true表示設(shè)置上限

參數(shù)size:當(dāng)capped值為true時(shí)岳链,需要指定此參數(shù)花竞,表示上限大小,當(dāng)文檔達(dá)到上限時(shí)掸哑,會(huì)將之前的數(shù)據(jù)覆蓋约急,單位為字節(jié)

db.createCollection("sub", { capped : true, size : 10 } )

查看當(dāng)前數(shù)據(jù)庫的集合

語法

show collections

刪除

語法

db.集合名稱.drop()

數(shù)據(jù)類型

下表為MongoDB中常用的幾種數(shù)據(jù)類型:

Object ID:文檔ID

String:字符串,最常用苗分,必須是有效的UTF-8

Boolean:存儲(chǔ)一個(gè)布爾值厌蔽,true或false

Integer:整數(shù)可以是32位或64位,這取決于服務(wù)器

Double:存儲(chǔ)浮點(diǎn)值

Arrays:數(shù)組或列表摔癣,多個(gè)值存儲(chǔ)到一個(gè)鍵

Object:用于嵌入式的文檔奴饮,即一個(gè)值為一個(gè)文檔

Null:存儲(chǔ)Null值

Timestamp:時(shí)間戳

Date:存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式

object id

每個(gè)文檔都有一個(gè)屬性纬向,為_id,保證每個(gè)文檔的唯一性

可以自己去設(shè)置_id插入文檔

如果沒有提供戴卜,那么MongoDB為每個(gè)文檔提供了一個(gè)獨(dú)特的_id逾条,類型為objectID

objectID是一個(gè)12字節(jié)的十六進(jìn)制數(shù)

前4個(gè)字節(jié)為當(dāng)前時(shí)間戳

接下來3個(gè)字節(jié)的機(jī)器ID

接下來的2個(gè)字節(jié)中MongoDB的服務(wù)進(jìn)程id

最后3個(gè)字節(jié)是簡單的增量值

插入

語法

db.集合名稱.insert(document)

插入文檔時(shí),如果不指定_id參數(shù)投剥,MongoDB會(huì)為文檔分配一個(gè)唯一的ObjectId

例1

db.stu.insert({name:'gj',gender:1})

例2

s1={_id:'20160101',name:'hr'}

s1.gender=0

db.stu.insert(s1)

簡單查詢

語法

db.集合名稱.find()

更新

語法

db.集合名稱.update(

? ?<query>,

? ?<update>?,

? {multi: <boolean>}

)

參數(shù)query:查詢條件师脂,類似sql語句update中where部分

參數(shù)update:更新操作符,類似sql語句update中set部分

參數(shù)multi:可選江锨,默認(rèn)是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:修改多條匹配到的數(shù)據(jù)

db.stu.update({},{$set:{gender:0}},{multi:true})

保存

語法

db.集合名稱.save(document)

如果文檔的_id已經(jīng)存在則修改汤徽,如果文檔的_id不存在則添加

例6

db.stu.save({_id:'20160102','name':'yk',gender:1})

例7

db.stu.save({_id:'20160102','name':'wyk'})

刪除

語法

db.集合名稱.remove(

?<query> ?,

? {

? ? justOne:<boolean>

? }

)

參數(shù)query:可選,刪除的文檔的條件

參數(shù)justOne:可選灸撰,如果設(shè)為true或1谒府,則只刪除一條,默認(rèn)false浮毯,表示刪除多條

例8:只刪除匹配到的第一條

db.stu.remove({gender:0},{justOne:true})

例9:全部刪除

db.stu.remove({})

關(guān)于size的示例

例10

創(chuàng)建集合

db.createCollection('sub',{capped:true,size:10})

插入第一條數(shù)據(jù)庫查詢

db.sub.insert({title:'linux',count:10})

db.sub.find()

插入第二條數(shù)據(jù)庫查詢

db.sub.insert({title:'web',count:15})

db.sub.find()

插入第三條數(shù)據(jù)庫查詢

db.sub.insert({title:'sql',count:8})

db.sub.find()

插入第四條數(shù)據(jù)庫查詢

db.sub.insert({title:'django',count:12})

db.sub.find()

插入第五條數(shù)據(jù)庫查詢

db.sub.insert({title:'python',count:14})

db.sub.find()


數(shù)據(jù)查詢

基本查詢

方法find():查詢

db.集合名稱.find({條件文檔})

方法findOne():查詢完疫,只返回第一個(gè)

db.集合名稱.findOne({條件文檔})

方法pretty():將結(jié)果格式化

db.集合名稱.find({條件文檔}).pretty()

比較運(yùn)算符

等于,默認(rèn)是等于判斷债蓝,沒有運(yùn)算符

小于$lt

小于或等于$lte

大于$gt

大于或等于$gte

不等于$ne

例1:查詢名稱等于'gj'的學(xué)生

db.stu.find({name:'gj'})

例2:查詢年齡大于或等于18的學(xué)生

db.stu.find({age:{$gte:18}})

邏輯運(yùn)算符

查詢時(shí)可以有多個(gè)條件壳鹤,多個(gè)條件之間需要通過邏輯運(yùn)算符連接

邏輯與:默認(rèn)是邏輯與的關(guān)系

例3:查詢年齡大于或等于18,并且性別為1的學(xué)生

db.stu.find({age:{$gte:18},gender:1})

邏輯或:使用$or

例4:查詢年齡大于18饰迹,或性別為0的學(xué)生

db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})

and和or一起使用

例5:查詢年齡大于18或性別為0的學(xué)生芳誓,并且學(xué)生的姓名為gj

db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})

范圍運(yùn)算符

使用"$in","$nin" 判斷是否在某個(gè)范圍內(nèi)

例6:查詢年齡為18啊鸭、28的學(xué)生

db.stu.find({age:{$in:[18,28]}})

支持正則表達(dá)式

使用//或$regex編寫正則表達(dá)式

例7:查詢姓黃的學(xué)生

db.stu.find({name:/^黃/})

db.stu.find({name:{$regex:'^黃'}}})

自定義查詢

使用$where后面寫一個(gè)函數(shù)锹淌,返回滿足條件的數(shù)據(jù)

例7:查詢年齡大于30的學(xué)生

db.stu.find({$where:function(){return this.age>20}})

Limit

方法limit():用于讀取指定數(shù)量的文檔

語法:

db.集合名稱.find().limit(NUMBER)

參數(shù)NUMBER表示要獲取文檔的條數(shù)

如果沒有指定參數(shù)則顯示集合中的所有文檔

例1:查詢2條學(xué)生信息

db.stu.find().limit(2)

skip

方法skip():用于跳過指定數(shù)量的文檔

語法:

db.集合名稱.find().skip(NUMBER)

參數(shù)NUMBER表示跳過的記錄條數(shù),默認(rèn)值為0

例2:查詢從第3條開始的學(xué)生信息

db.stu.find().skip(2)

一起使用

方法limit()和skip()可以一起使用赠制,不分先后順序

創(chuàng)建數(shù)據(jù)集

for(i=0;i<15;i++){db.t1.insert({_id:i})}

查詢第5至8條數(shù)據(jù)

db.stu.find().limit(4).skip(5)

db.stu.find().skip(5).limit(4)

投影

在查詢到的返回結(jié)果中赂摆,只選擇必要的字段,而不是選擇一個(gè)文檔的整個(gè)字段

如:一個(gè)文檔有5個(gè)字段钟些,需要顯示只有3個(gè)烟号,投影其中3個(gè)字段即可

語法:

參數(shù)為字段與值,值為1表示顯示政恍,值為0不顯示

db.集合名稱.find({},{字段名稱:1,...})

對于需要顯示的字段汪拥,設(shè)置為1即可,不設(shè)置即為不顯示

特殊:對于_id列默認(rèn)是顯示的抚垃,如果不顯示需要明確設(shè)置為0

例1

db.stu.find({},{name:1,gender:1})

例2

db.stu.find({},{_id:0,name:1,gender:1})

排序

方法sort()喷楣,用于對結(jié)果集進(jìn)行排序

語法

db.集合名稱.find().sort({字段:1,...})

參數(shù)1為升序排列

參數(shù)-1為降序排列

例1:根據(jù)性別降序趟大,再根據(jù)年齡升序

db.stu.find().sort({gender:-1,age:1})

統(tǒng)計(jì)個(gè)數(shù)

方法count()用于統(tǒng)計(jì)結(jié)果集中文檔條數(shù)

語法

db.集合名稱.find({條件}).count()

也可以與為

db.集合名稱.count({條件})

例1:統(tǒng)計(jì)男生人數(shù)

db.stu.find({gender:1}).count()

例2:統(tǒng)計(jì)年齡大于20的男生人數(shù)

db.stu.count({age:{$gt:20},gender:1})

消除重復(fù)

方法distinct()對數(shù)據(jù)進(jìn)行去重

語法

db.集合名稱.distinct('去重字段',{條件})

例1:查找年齡大于18的性別(去重)

db.stu.distinct('gender',{age:{$gt:18}})

總結(jié)

安裝

數(shù)據(jù)庫創(chuàng)建、刪除

集合創(chuàng)建铣焊、刪除

文檔增加逊朽、修改、刪除

文檔查詢:find(),limit(),skip(),投影,sort(),count(),distinct()

高級操作

講解關(guān)于mongodb的高級操作曲伊,包括聚合叽讳、主從復(fù)制、分片坟募、備份與恢復(fù)岛蚤、MR

完成python與mongodb的交互

聚合 aggregate

聚合(aggregate)主要用于計(jì)算數(shù)據(jù),類似sql中的sum()懈糯、avg()

語法

db.集合名稱.aggregate([{管道:{表達(dá)式}}])

管道

管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的輸入

ps ajx | grep mongo

在mongodb中涤妒,管道具有同樣的作用,文檔處理完畢后赚哗,通過管道進(jìn)行下一次處理

常用管道

$group:將集合中的文檔分組她紫,可用于統(tǒng)計(jì)結(jié)果

$match:過濾數(shù)據(jù),只輸出符合條件的文檔

$project:修改輸入文檔的結(jié)構(gòu)屿储,如重命名贿讹、增加、刪除字段够掠、創(chuàng)建計(jì)算結(jié)果

$sort:將輸入文檔排序后輸出

$limit:限制聚合管道返回的文檔數(shù)

$skip:跳過指定數(shù)量的文檔民褂,并返回余下的文檔

$unwind:將數(shù)組類型的字段進(jìn)行拆分

表達(dá)式

處理輸入文檔并輸出

語法

表達(dá)式:'$列名'

常用表達(dá)式

$sum:計(jì)算總和,$sum:1同count表示計(jì)數(shù)

$avg:計(jì)算平均值

$min:獲取最小值

$max:獲取最大值

$push:在結(jié)果文檔中插入值到一個(gè)數(shù)組中

$first:根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)

$last:根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù)

$group

將集合中的文檔分組疯潭,可用于統(tǒng)計(jì)結(jié)果

_id表示分組的依據(jù)赊堪,使用某個(gè)字段的格式為'$字段'

例1:統(tǒng)計(jì)男生、女生的總?cè)藬?shù)

db.stu.aggregate([

? ? {$group:

? ? ? ? {

? ? ? ? ? ? _id:'$gender',

? ? ? ? ? ? counter:{$sum:1}

? ? ? ? }

? ? }

])

Group by null

將集合中所有文檔分為一組

例2:求學(xué)生總?cè)藬?shù)袁勺、平均年齡

db.stu.aggregate([

? ? {$group:

? ? ? ? {

? ? ? ? ? ? _id:null,

? ? ? ? ? ? counter:{$sum:1},

? ? ? ? ? ? avgAge:{$avg:'$age'}

? ? ? ? }

? ? }

])

透視數(shù)據(jù)

例3:統(tǒng)計(jì)學(xué)生性別及學(xué)生姓名

db.stu.aggregate([

? ? {$group:

? ? ? ? {

? ? ? ? ? ? _id:'$gender',

? ? ? ? ? ? name:{$push:'$name'}

? ? ? ? }

? ? }

])

使用$$ROOT可以將文檔內(nèi)容加入到結(jié)果集的數(shù)組中雹食,代碼如下

db.stu.aggregate([

? ? {$group:

? ? ? ? {

? ? ? ? ? ? _id:'$gender',

? ? ? ? ? ? name:{$push:'$$ROOT'}

? ? ? ? }

? ? }

])

$match

用于過濾數(shù)據(jù)畜普,只輸出符合條件的文檔

使用MongoDB的標(biāo)準(zhǔn)查詢操作

例1:查詢年齡大于20的學(xué)生

db.stu.aggregate([

? ? {$match:{age:{$gt:20}}}

])

例2:查詢年齡大于20的男生期丰、女生人數(shù)

db.stu.aggregate([

? ? {$match:{age:{$gt:20}}},

? ? {$group:{_id:'$gender',counter:{$sum:1}}}

])

$project

修改輸入文檔的結(jié)構(gòu),如重命名吃挑、增加钝荡、刪除字段、創(chuàng)建計(jì)算結(jié)果

例1:查詢學(xué)生的姓名舶衬、年齡

db.stu.aggregate([

? ? {$project:{_id:0,name:1,age:1}}

])

例2:查詢男生埠通、女生人數(shù),輸出人數(shù)

db.stu.aggregate([

? ? {$group:{_id:'$gender',counter:{$sum:1}}},

? ? {$project:{_id:0,counter:1}}

])

$sort

將輸入文檔排序后輸出

例1:查詢學(xué)生信息逛犹,按年齡升序

b.stu.aggregate([{$sort:{age:1}}])

例2:查詢男生端辱、女生人數(shù)梁剔,按人數(shù)降序

db.stu.aggregate([

? ? {$group:{_id:'$gender',counter:{$sum:1}}},

? ? {$sort:{counter:-1}}

])

$limit

限制聚合管道返回的文檔數(shù)

例1:查詢2條學(xué)生信息

db.stu.aggregate([{$limit:2}])

$skip

跳過指定數(shù)量的文檔,并返回余下的文檔

例2:查詢從第3條開始的學(xué)生信息

db.stu.aggregate([{$skip:2}])

例3:統(tǒng)計(jì)男生舞蔽、女生人數(shù)荣病,按人數(shù)升序,取第二條數(shù)據(jù)

db.stu.aggregate([

? ? {$group:{_id:'$gender',counter:{$sum:1}}},

? ? {$sort:{counter:1}},

? ? {$skip:1},

? ? {$limit:1}

])

注意順序:先寫skip渗柿,再寫limit

$unwind

將文檔中的某一個(gè)數(shù)組類型字段拆分成多條个盆,每條包含數(shù)組中的一個(gè)值

語法1

對某字段值進(jìn)行拆分

db.集合名稱.aggregate([{$unwind:'$字段名稱'}])

構(gòu)造數(shù)據(jù)

db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})

查詢

db.t2.aggregate([{$unwind:'$size'}])

語法2

對某字段值進(jìn)行拆分

處理空數(shù)組、非數(shù)組朵栖、無字段颊亮、null情況

db.inventory.aggregate([{

? ? $unwind:{

? ? ? ? path:'$字段名稱',

? ? ? ? preserveNullAndEmptyArrays:<boolean>#防止數(shù)據(jù)丟失

? ? }

}])

構(gòu)造數(shù)據(jù)

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'}])

查看查詢結(jié)果,發(fā)現(xiàn)對于空數(shù)組陨溅、無字段终惑、null的文檔,都被丟棄了

問:如何能不丟棄呢门扇?

答:使用語法2查詢

db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])

超級管理員

為了更安全的訪問mongodb狠鸳,需要訪問者提供用戶名和密碼,于是需要在mongodb中創(chuàng)建用戶

采用了角色-用戶-數(shù)據(jù)庫的安全管理方式

常用系統(tǒng)角色如下:

root:只在admin數(shù)據(jù)庫中可用悯嗓,超級賬號件舵,超級權(quán)限

Read:允許用戶讀取指定數(shù)據(jù)庫

readWrite:允許用戶讀寫指定數(shù)據(jù)庫

創(chuàng)建超級管理用戶

use admin

db.createUser({

? ? user:'admin',

? ? pwd:'123',

? ? roles:[{role:'root',db:'admin'}]

})

啟用安全認(rèn)證

修改配置文件

sudo vi /etc/mongod.conf

啟用身份驗(yàn)證

注意:keys and values之間一定要加空格, 否則解析會(huì)報(bào)錯(cuò)

security:

? authorization: enabled

重啟服務(wù)

sudo service mongod stop

sudo service mongod start

終端連接

mongo -u 'admin' -p '123' --authenticationDatabase 'admin'

普通用戶管理

使用超級管理員登錄,然后進(jìn)入用戶管理操作

查看當(dāng)前數(shù)據(jù)庫的用戶

use test1

show users

創(chuàng)建普通用戶

db.createUser({

? ? user:'t1',

? ? pwd:'123',

? ? roles:[{role:'readWrite',db:'test1'}]

})

終端連接

mongo -u t1 -p 123 --authenticationDatabase test1

切換數(shù)據(jù)庫脯厨,執(zhí)行命令查看效果

修改用戶:可以修改pwd铅祸、roles屬性

db.updateUser('t1',{pwd:'456'})

復(fù)制(副本集)

什么是復(fù)制

復(fù)制提供了數(shù)據(jù)的冗余備份,并在多個(gè)服務(wù)器上存儲(chǔ)數(shù)據(jù)副本合武,提高了數(shù)據(jù)的可用性临梗,并可以保證數(shù)據(jù)的安全性

復(fù)制還允許從硬件故障和服務(wù)中斷中恢復(fù)數(shù)據(jù)

為什么要復(fù)制

數(shù)據(jù)備份

數(shù)據(jù)災(zāi)難恢復(fù)

讀寫分離

高(24* 7)數(shù)據(jù)可用性

無宕機(jī)維護(hù)

副本集對應(yīng)用程序是透明

復(fù)制的工作原理

復(fù)制至少需要兩個(gè)節(jié)點(diǎn)A、B...

A是主節(jié)點(diǎn)稼跳,負(fù)責(zé)處理客戶端請求

其余的都是從節(jié)點(diǎn)盟庞,負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)

節(jié)點(diǎn)常見的搭配方式為:一主一從、一主多從

主節(jié)點(diǎn)記錄在其上的所有操作汤善,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作什猖,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致

主節(jié)點(diǎn)與從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互保障數(shù)據(jù)的一致性

復(fù)制的特點(diǎn)

N 個(gè)節(jié)點(diǎn)的集群

任何節(jié)點(diǎn)可作為主節(jié)點(diǎn)

所有寫入操作都在主節(jié)點(diǎn)上

自動(dòng)故障轉(zhuǎn)移

自動(dòng)恢復(fù)

設(shè)置復(fù)制節(jié)點(diǎn)

接下來的操作需要打開多個(gè)終端窗口红淡,而且可能會(huì)連接多臺(tái)ubuntu主機(jī)不狮,會(huì)顯得有些亂,建議在xshell中實(shí)現(xiàn)

step1:創(chuàng)建數(shù)據(jù)庫目錄t1在旱、t2

在Desktop目錄下演示摇零,其它目錄也可以,注意權(quán)限即可

mkdir t1

mkdir t2

step2:使用如下格式啟動(dòng)mongod桶蝎,注意replSet的名稱是一致的

mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0

mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0

step3:連接主服務(wù)器驻仅,此處設(shè)置192.168.196.128:27017為主服務(wù)器

mongo --host 192.168.196.128 --port 27017

step4:初始化

rs.initiate()

初始化完成后谅畅,提示符如下圖:


step5:查看當(dāng)前狀態(tài)

rs.status()

當(dāng)前狀態(tài)如下圖:


step6:添加復(fù)本集

rs.add('192.168.196.128:27018')

step7:復(fù)本集添加成功后,當(dāng)前狀態(tài)如下圖:


step8:連接第二個(gè)mongo服務(wù)

mongo --host 192.168.196.128 --port 27018

連接成功后噪服,提示符如下圖:


step9:向主服務(wù)器中插入數(shù)據(jù)

use test1

for(i=0;i<10;i++){db.t1.insert({_id:i})}

db.t1.find()

step10:在從服務(wù)器中插查詢

說明:如果在從服務(wù)器上進(jìn)行讀操作铃彰,需要設(shè)置rs.slaveOk()

rs.slaveOk()

db.t1.find()

其它說明

刪除從節(jié)點(diǎn)

rs.remove('192.168.196.128:27018')

關(guān)閉主服務(wù)器后,再重新啟動(dòng)芯咧,會(huì)發(fā)現(xiàn)原來的從服務(wù)器變?yōu)榱藦姆?wù)器牙捉,新啟動(dòng)的服務(wù)器(原來的從服務(wù)器)變?yōu)榱藦姆?wù)器

備份

語法

mongodump -h dbhost -d dbname -o dbdirectory

-h:服務(wù)器地址,也可以指定端口號

-d:需要備份的數(shù)據(jù)庫名稱

-o:備份的數(shù)據(jù)存放位置敬飒,此目錄中存放著備份出來的數(shù)據(jù)

例1

sudo mkdir test1bak

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

恢復(fù)

語法

mongorestore -h dbhost -d dbname --dir dbdirectory

-h:服務(wù)器地址

-d:需要恢復(fù)的數(shù)據(jù)庫實(shí)例

--dir:備份數(shù)據(jù)所在位置

例2

mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

與python交互

點(diǎn)擊查看官方文檔

安裝python包

進(jìn)入虛擬環(huán)境

sudo pip install pymongo

或源碼安裝

python setup.py

引入包pymongo

import pymongo

連接邪铲,創(chuàng)建客戶端

client=pymongo.MongoClient("localhost", 27017)

獲得數(shù)據(jù)庫test1

db=client.test1

獲得集合stu

stu = db.stu

添加文檔

s1={name:'gj',age:18}

s1_id = stu.insert_one(s1).inserted_id

查找一個(gè)文檔

s2=stu.find_one()

查找多個(gè)文檔1

for cur in stu.find():

? ? print cur

查找多個(gè)文檔2

cur=stu.find()

cur.next()

cur.next()

cur.next()

獲取文檔個(gè)數(shù)

print stu.count()

總結(jié)

聚合

安全

副本集

備份與恢復(fù)

與python交互

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市无拗,隨后出現(xiàn)的幾起案子带到,更是在濱河造成了極大的恐慌,老刑警劉巖英染,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揽惹,死亡現(xiàn)場離奇詭異,居然都是意外死亡四康,警方通過查閱死者的電腦和手機(jī)搪搏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闪金,“玉大人疯溺,你說我怎么就攤上這事“タ眩” “怎么了囱嫩?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長漏设。 經(jīng)常有香客問我墨闲,道長,這世上最難降的妖魔是什么郑口? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任鸳碧,我火速辦了婚禮,結(jié)果婚禮上潘酗,老公的妹妹穿的比我還像新娘杆兵。我一直安慰自己,他們只是感情好仔夺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著攒砖,像睡著了一般缸兔。 火紅的嫁衣襯著肌膚如雪日裙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天惰蜜,我揣著相機(jī)與錄音昂拂,去河邊找鬼。 笑死抛猖,一個(gè)胖子當(dāng)著我的面吹牛格侯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播财著,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼联四,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撑教?” 一聲冷哼從身側(cè)響起朝墩,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伟姐,沒想到半個(gè)月后收苏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愤兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年鹿霸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秆乳。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杜跷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矫夷,到底是詐尸還是另有隱情葛闷,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布双藕,位于F島的核電站淑趾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忧陪。R本人自食惡果不足惜扣泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘶摊。 院中可真熱鬧延蟹,春花似錦、人聲如沸叶堆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沥匈,卻和暖如春蔗喂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背高帖。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工缰儿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人散址。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓乖阵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親预麸。 傳聞我的和親對象是個(gè)殘疾皇子瞪浸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. MongoDB 簡介 MongoDB是一個(gè)可擴(kuò)展的高性能,開源师崎,模式自由默终,面向文檔的NoSQL,基于分布式文...
    rhlp閱讀 1,117評論 0 3
  • 簡介 NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能...
    奮斗的老王閱讀 3,042評論 4 47
  • 知識點(diǎn):美化輸出:db.stu.find().pretty() $project:修改輸入文檔的結(jié)構(gòu)犁罩∑氡危可以用來重命...
    胖虎很可愛閱讀 728評論 0 1
  • 安裝 MongoDB Windowns、Ubuntu17.10 下安裝 MongoDB教程在此 MongoDB 幫...
    Kangvcar閱讀 2,097評論 0 13
  • 1床估、一二三理論:一個(gè)主題含滴、兩個(gè)維度、三個(gè)方面丐巫。 比如:以成功為一個(gè)主題谈况,兩個(gè)維度——工作、家庭递胧,家庭方面從三個(gè)方面...
    polo的簡書閱讀 208評論 0 0