安裝mongodb
sudo apt-get install -y mongodb-org
創(chuàng)建mongodb文件目錄
$ sudo mkdir -p /data/db #創(chuàng)建數(shù)據(jù)存儲目錄
$ sudo chmod mongodb:mongodb /data/*
啟動铭拧、停止闽瓢、重啟
$ sudo service mongodb start
$ sudo service mongodb stop
$ sudo service mongodb restart
進(jìn)入mongoDB客戶端
$ sudo mongo
建議使用robomongo
數(shù)據(jù)庫操作
查看當(dāng)前數(shù)據(jù)庫名稱
db
列出所有在物理上存在的數(shù)據(jù)庫
show dbs
切換數(shù)據(jù)庫
如果數(shù)據(jù)庫不存在,則指向數(shù)據(jù)庫层宫,但不創(chuàng)建学密,直到插入數(shù)據(jù)或創(chuàng)建集合時數(shù)據(jù)庫才被創(chuàng)建
use Database_Name
刪除數(shù)據(jù)庫
drop Database_Name
集合collections
創(chuàng)建集合
db.createCollection(name, options)
- options參數(shù)代表長度限制,如果想做限制可以:
db.createCollection("sub", { capped : true, size : 10 } )
查看目前存在的集合
show collections
刪除集合
db.Collection_Name.drop()
數(shù)據(jù)維護(hù)
插入
db.collections_name.insert({name:'張三',gender:true})
s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
更新
db.collection_name.update(
<query>,
<update>,
{multi: <boolean>}
)
- <query>要修改的值横浑,這里寫一個查詢
- <update>修改為什么值
- 默認(rèn)只修改一條剔桨,如果多條修改的話需要第三個參數(shù){multi:true}
db.stu.uppdate({name:'張三'},{age:18}) #這條修改會改變文檔的格式
db.stu.uppdate({name:'張三'},{$set:{age:18}}) #這條修改只會改變文檔中age的值
刪除
db.stu.remove({gender:0},{justOne:true}) #只刪除一條匹配的數(shù)據(jù)
db.stu.remove({}) #刪除stu集合中所有數(shù)據(jù)
數(shù)據(jù)查詢
db.stu.find({name:'張三'}) #基礎(chǔ)查詢
db.stu.find().pretty() #格式化查詢
db.stu.findOne({name:'張三'}) #查詢符合條件的一條數(shù)據(jù)
比較運(yùn)算符
- 等于,默認(rèn)是等于判斷徙融,沒有運(yùn)算符
- 小于$lt
- 小于或等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
db.stu.find({age:{$gte:18}})
邏輯運(yùn)算符
- 查詢時可以有多個條件洒缀,多個條件之間需要通過邏輯運(yùn)算符連接
- 邏輯與:默認(rèn)是邏輯與的關(guān)系
db.stu.find({age:{$gte:18}},{title:'python'})
- 邏輯或:使用$or
db.stu.find({age:{$gte:18}},$or:[{title:'python'},{sal:{$lte:1500}}])
范圍運(yùn)算符
- 使用"$in","$nin" 判斷是否在某個范圍內(nèi)
db.stu.find(name:{$in:['張三','李四','王五']})
支持正則表達(dá)式
- 使用//或$regex編寫正則表達(dá)式
db.stu.find({name:{$regex:'^王'}})
db.stu.find({name:/^王/})
自定義查詢
- 使用$where后面寫一個函數(shù)欺冀,返回滿足條件的數(shù)據(jù)
db.stu.find({$where:function(){return this.age>20}})
LIMIT與SKIP
db.stu.find().limit(2)
db.stu.find().skip(2)
db.stu.find().skip(2).limit(2) #建議先skip再limit
投影
- 在查詢到的返回結(jié)果中树绩,只選擇必要的字段,而不是選擇一個文檔的整個字段
db.stu.find({},{name:1,gender:1}) #查詢結(jié)果會有的字段是_id隐轩、name饺饭、gender
db.stu.find({},{_id:0,name:1,gender:1}) #查詢結(jié)果不會存在_id
排序
- 方法sort(),用于對結(jié)果集進(jìn)行排序
db.stu.find().sort({gender:-1,age:1})
統(tǒng)計個數(shù)
- 方法count()用于統(tǒng)計結(jié)果集中文檔條數(shù)
db.stu.find({title:'python'}).count()
db.stu.count({title:'python'})
消除重復(fù)
- 方法distinct()對數(shù)據(jù)進(jìn)行去重
db.集合名稱.distinct('去重字段',{條件})
db.stu.distinct('name',{age:{$gte:20}})
聚合 aggregate
- 語法
db.集合名稱.aggregate([{管道:{表達(dá)式}}])
- 常用管道
- $group:將集合中的文檔分組职车,可用于統(tǒng)計結(jié)果
- $match:過濾數(shù)據(jù)瘫俊,只輸出符合條件的文檔
- $project:修改輸入文檔的結(jié)構(gòu)鹊杖,如重命名、增加扛芽、刪除字段骂蓖、創(chuàng)建計算結(jié)果
- $sort:將輸入文檔排序后輸出
- $limit:限制聚合管道返回的文檔數(shù)
- $skip:跳過指定數(shù)量的文檔,并返回余下的文檔
- $unwind:將數(shù)組類型的字段進(jìn)行拆分
- 常用表達(dá)式
- $sum:計算總和胸哥,$sum:1同count表示計數(shù)
- $avg:計算平均值
- $min:獲取最小值
- $max:獲取最大值
- $push:在結(jié)果文檔中插入值到一個數(shù)組中
- $first:根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù)
- $last:根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù)
db.stu.aggregate([
{$match:{age:{$gt:20}}},
{$group:{_id:'$title',maxAge:{$max:'$age'}}},
{$sort:{maxAge:-1}},
{$skip:2},
{$limit:1}
])
db.stu.aggregate([
{$project:{_id:0,name:1,age:1}}
])
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
db.t2.aggregate([{$unwind:'$size'}])
db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}]) #消除null或者空數(shù)組的影響
索引
創(chuàng)建索引
- 1表示升序涯竟,-1表示降序
db.集合.ensureIndex({屬性:1})
如
db.stu.ensureIndex({'name':1})
db.stu.ensureIndex({'name':1},{'uniqe':true}) #創(chuàng)建唯一索引
db.stu.ensureIndex({'name':1,'age':-1}) #創(chuàng)建多行索引
查看所有索引
db.stu.getIndexes()
刪除索引
db.stu.dropIndexes('索引名') #索引名從db.stu.getIndexes()中查詢
安全性
- 常用系統(tǒng)角色如下:
- root:只在admin數(shù)據(jù)庫中可用,超級賬號空厌,超級權(quán)限
- Read:允許用戶讀取指定數(shù)據(jù)庫
- readWrite:允許用戶讀寫指定數(shù)據(jù)庫
mongo登錄客戶端創(chuàng)建超級管理員用戶
use admin
db.createUser({
user:'admin',
pwd:'admin',
roles:[{role:'root',db:'admin'}]
})
修改配置文件啟動身份驗證
sudo vi /etc/mongod.conf
security:
authorization: enabled #注意enabled前有空格
重啟mongd服務(wù)
sudo service mongod restart
退出后重新登錄
mongo -u admin -p --authenticationDatabase admin
使用超級用戶創(chuàng)建普通用戶
use runoob #要給哪個數(shù)據(jù)庫創(chuàng)建用戶就use哪個
db.createUser({
user:'runoob',
pwd:'runoob',
roles:[{role:'readWrite',db:'runoob'}]
})
退出后使用普通用戶登錄
mogo -u runoob -p --authenticationDatabase runoob
修改用戶:可以修改pwd庐船、roles屬性(只能用admin用戶修改)
db.updateUser('runoob',{pwd:'123'})
副本集
創(chuàng)建數(shù)據(jù)存儲路徑
cd ~/Desktop
mkdir t1
mkdir t2
啟動主從服務(wù)
mongod --bind_ip 192.168.100.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.100.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
也可以通過配置文件修改啟動服務(wù)vim /etc/mongod.conf
#主服務(wù)配置
port=27018 #指定端口
fork=true #后臺運(yùn)行
dbpath=/home/map/mongodb/mongo #規(guī)定數(shù)據(jù)庫的位置
logpath=/home/map/mongodb/mlog/mongodb.log #規(guī)定數(shù)據(jù)庫的日志文件
master=true #設(shè)置主
# bind_ip=127.0.0.1,192.168.0.4 #允許的地址 為了安全
nohttpinterface=true #禁止http訪問
#從服務(wù)配置
port=27018 #指定端口
fork=true #后臺運(yùn)行
dbpath=/home/map/mongodb/mongo #規(guī)定數(shù)據(jù)庫的位置
logpath=/home/map/mongodb/mlog/mongodb.log #規(guī)定數(shù)據(jù)庫的日志文件
slave=true #聲明從
source=192.168.0.4:27018 #規(guī)定從屬于哪個ip 注意:ip是主服務(wù)器的 最好用內(nèi)網(wǎng)ip
# bind_ip=127.0.0.1,192.168.0.4 #允許的地址 為了安全
nohttpinterface=true #禁止http訪問
$ sudo mongod -f ./mongod.conf #分別啟動主從服務(wù)器
連接主服務(wù)
mongo --host 192.168.196.128 --port 27017
主服務(wù)初始化并查看狀態(tài)
rs.initiate()
rs.status()
主服務(wù)添加從服務(wù)集
rs.add('192.168.196.128:27018')
啟動從服務(wù)
mongo --host 192.168.196.128 --port 27018
向主服務(wù)器中插入數(shù)據(jù)
use test1
for(i=0;i<10;i++){db.t1.insert({_id:i})}
db.t1.find()
在從服務(wù)器中插查詢
rs.slaveOk()
db.t1.find()
刪除從服務(wù)
rs.remove('192.168.196.128:27018')
備份與恢復(fù)
備份
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
#不需要安全認(rèn)證
sudo mongodump -u runoob -p runoob --authenticationDatabase runoob -h 192.168.100.128:27017 -d runoob -o ~/Desktop/back #需要安全認(rèn)證
恢復(fù)
sudo mongorestore -h 192.168.100.128:27107 -d runoob1 -o ~/Desktop/back #不需要安全認(rèn)證
sudo mongorestore -u admin -p admin --authenticationDatabase admin -h 192.168.100.128:27017 -d runoob1 -o ~/Desktop/back #需要安全認(rèn)證