安裝
mongodb服務(wù):
sudo service mongod/mongodb start
sudo service mongod/mongodb stop
sudo service mongod/mongodb restart
配置文件路徑 /etc/mongod.conf|mongodb.conf
鏈接:
mongo
mongo -h ip:port
mongo --host ip --port port
mongodb的操作:
數(shù)據(jù)庫:
? ? show dbs? 查看數(shù)據(jù)庫? ? ?
? ? db? ? ? ? 查看當(dāng)前數(shù)據(jù)庫
? ? use dbname? 切換數(shù)據(jù)庫
? ? db.dropDatabase()? 刪除當(dāng)前數(shù)據(jù)庫
? ? db.stats()
集合:
? ? db.createCollecrion('colname',屬性)
? ? db.createCollecrion('colname')
? ? db.createCollection('colname',{capped:true,size:字節(jié)大小,max:最大文檔數(shù)量})
? ? db.colname.drop()
增:
db.colname.insert(docment)
db.colname.insert([docment,docment,...])
db.colname.insertOne(docment)
db.colname.insertMany([docment,docment,...])
刪除:
db.colname.remove({})
db.colname.remove({條件})
db.colname.remove({條件},1) -> db.colname.remove({條件},{justOne:true})
修改:
更新文檔中的某些鍵
db.colname.update({條件},{$set:{鍵:值}})
全文檔更新(如果沒找到司澎,則作為一條新的數(shù)據(jù)插入)
db.colname.update({條件},{鍵:值})
save
case1:假如我們要更新的文檔——id存在則修改
case2:假如我們要更新的文檔——id不存在,則作為新的文檔插入
db.colname.save({_id:'',鍵:值,鍵:值.....})
查:
db.colname.find()? ->? db.colname.find({})
db.colname.find({條件}) -> db.colname.find({age:20,name:'xxx'})
限制查詢:limit
db.colname.find({條件}).limit(num) -> db.colname.find({age:20,name:'xxx'}).limit(3)
跳過:skip
db.colname.find({條件}).skip(num)
save結(jié)合使用:
db.colname.find({條件}).skip(num).limit(num)
排序:sort [1:升序,-1:降序]
db.colname.find({條件}).sort({鍵:方向})
投影: project(0:不顯示,1:顯示)
db.colname.find({},{字段:1,字段:1,字段:0})
db.colname.find({},{字段:0})
去重:distinct
db.colname.distinct('鍵',{條件}}) -> db.colname.distinct('age',{name:'xxx'})
統(tǒng)計:count()
db.colname.find().count()
db.colname.count({條件}) -> db.colname.find({條件}).count()
返回所有鍵位什么什么的類型的文檔 type
db.colname.find({鍵:{$type:'類型(string,int)'}})
比較運(yùn)算符
$lt 小于 -> db.colname.find({salary:{$lt:10000}}).count()
$lte 小于等于 -> db.colname.find({salary:{$lte:10000}}).count()
$gt 大于?
$gte 大于等于
$ne 不等于
邏輯運(yùn)算符
$or -> db.colname.find({$or:[{salary:{$gt:10000}},{name:'李明'}]})
范圍運(yùn)算符
$in -> db.colname.find({鍵:{$in:[19,20,23]}})
$nin -> db.colname.find({age:{$nin:{19,20,23}}})
正則查詢:(必須是字符串)
db.colname.find({name:/^李.*?/})
db.colname.find({name:$regex:'^李.*?'})
自定義查詢:
db.colname.find({$where:function(){reture this.name=='李明'}})
db.colname.find({$where:function(){reture this.age > 20}})
聚合操作:
管道:
$group (分組)
統(tǒng)計班級人數(shù):?
-> db.colname.aggregate([{$group:{_id:'$class',count:{$sum:1}}])
班級的平均年齡:
-> db.colname.aggregate([{$group:{_id:'$class',avgage:{$avg:'$age'}}])
返回班級的最大年齡重荠,最小年齡
db.colname.aggregate([{$group:{_id:'$class',maxage:{$max:'$age'}}])
db.colname.aggregate([{$group:{_id:'$class',maxage:{$min:'$age'}}])
$project (只返回年齡和性別)
db.colname.aggregate([{$project:{age:1,gender:1,_id:0}}])
$match (返回年齡在大于50,小于100)
db.colname.aggregate([{$match:{age:{$gt:50,$lt:100}}}])
$skip與$limit限制查詢
db.colname.aggregate([{$match:{age:{$gt:30}}},{$limit:3}])
db.colname.aggregate([{$match:{age:{$gt:30}}},{$skip:3}])
db.colname.aggregate([{$match:{age:{$gt:30}}},{$skip:3},{$limit:3}])
$unwind:將文檔中的鍵對應(yīng)的數(shù)組箭阶,拆分程單條獨(dú)立的數(shù)據(jù)
db.colname.aggregate([{$unwind:'$tags'}])
$sort 排序 (返回年齡在大于50,小于100,降序排序)
db.colname.aggregate([{$match:{age{$gt:50,$lt:100}}},{$sort:{age:-1}}])
(返回年齡在大于50,小于100,升序排序)
db.colname.aggregate([{$match:{age{$gt:50,$lt:100}}},{$sort:{age:1}}])
聚合函數(shù):
$sum
-> db.colname.aggregate([{$group:{_id:'$class',count:{$sum:1}}])
$avg
-> db.colname.aggregate([{$group:{_id:'$class',avgage:{$avg:'$age'}}])
$min
-> db.colname.aggregate([{$group:{_id:'$class',maxage:{$min:'$age'}}])
$push:
根據(jù)班級進(jìn)行分組,返回班級下所有的搬家同學(xué)的姓名
-> db.colname.aggregate(pP$group:{_id:'$class_',names:{$push:'$name'},age:{$push:'$age'}})
$last:
返回接總的最后一個name
db.colname.aggregate([{$group:{_id:'null',last:{$last:'$name'}}}])
$first:
返回集合總的第一個name
db.colname.aggregate([{$group:{_id:'null',first:{$first:'$name'}}}])
索引:
_id索引:這個在插入文檔時會自動創(chuàng)建
普通索引:
? ? 單鍵索引:
? ? ? ? -> db.colname.createIndex({'索引鍵':方向})
? ? 復(fù)合索引:
? ? ? ? -> db.colname.createIndex({'索引鍵':方向,'索引鍵':'方向'...})
子文檔索引:
{
? ? class:'1804',
? ? student:{
? ? ? ? name:'李明',
? ? ? ? age:20,
? ? ? ? email:'llw@qq.com'
? ? ? ? adress:'北京'
? ? }
}
db.colname.createIndex({'student.name:1,'student.email:-1'})
使用 db.colname.find({student.name:'李明','student.email':'llw@qq.com'})
數(shù)組索引:
db.colname.createIndex({tags:1})
全文索引:
{
? ? 'content':'abc 123 李明 1804班'
}
db.colname.createIndex({content:'text'...})
使用
db.colname.find({$text:{$search:'關(guān)鍵詞'}})
屬性:
backgroud 在后臺創(chuàng)建索引
unique 唯一索引
name 給索引起一個名稱
sparse 稀疏索引(if set 了這個屬性戈鲁,文檔中如果含有這個索引鍵仇参,那么創(chuàng)建索引,else不創(chuàng)建)
TTL expireAfterSeconds 秒: 該屬性設(shè)置文檔在集合中存活的時間婆殿,超時诈乒,刪除
注意:我們直接插入一個時間,會跟文檔中真正插入的時間婆芦,相差8小時
TTL補(bǔ)充:
? ? _id 不能設(shè)置為日期索引
? ? 不能將已創(chuàng)建的索引直接修改位時間索引怕磨,只能刪除,重新創(chuàng)建
? ? TTL 不能是符合索引
刪除索引
db.colname.dropIndex('索引名')
db.colname.dropIndexs()
查看集合中的所有索引
db.colname.getIndexs()
查看集合中的索引的總大小
db.colname.totalIndexSize()
強(qiáng)制索引
db.colname.find({條件}).hint('索引名')
重建索引
db.colname.reIndex()
建立索引的注意事項(xiàng)消约、優(yōu)點(diǎn)肠鲫、缺點(diǎn):
優(yōu)點(diǎn):相當(dāng)于創(chuàng)建了一個目錄,能夠提高查找的效率
缺點(diǎn):1.對于插入或粮、刪除导饲、修改數(shù)據(jù)會變慢,因?yàn)樵谧霾迦肼炔摹h除渣锦、修改數(shù)據(jù)的時候,索引也會隨之變化
這樣會降低效率 2.創(chuàng)建索引會產(chǎn)生額外的數(shù)據(jù)浓体,增加我們對硬件的要求泡挺,會占額外占用內(nèi)存
注意事項(xiàng):
1.盡量減少創(chuàng)建不必要的索引
2.經(jīng)常變動的鍵不必要創(chuàng)建索引
3.不會成為查詢條件的值不需要創(chuàng)建索引
4.mongodb集合中最大的索引個數(shù)不能超過64個,
索引的名稱不能超過128個字符,符合索引最大只能有31字段
5.不能命中索引的情況:$in $nin 范圍運(yùn)算符命浴,以及比較運(yùn)算符...
6.mongodb中索引放在內(nèi)存中,必須確保索引的大小不會超過內(nèi)存,
如果超過內(nèi)存最大限制生闲,mongodb會自動刪除一些索引
創(chuàng)建用戶:
普通用戶媳溺、超級管理員
創(chuàng)建超級管理員
root:
read:
readwrite
use admin
db.createUser({
? ? 'user':'username',
? ? 'pwd':'password',
? ? 'roles':[{'role':'root',db:'admin'}]
})
打開mongodb的安全設(shè)置
sudo vim /etc/mongod.conf
高版本
security:
authorization:enabled
或者:
1. sudo vim /etc/mongodb.conf
低版本
auth=true
2.修改完畢之后重置:sudo service mongodb restart
3.使用超管登錄
mongo -u 用戶名 -p 密碼 --authenticationDatabase 'admin'
創(chuàng)建一個普通用戶
use dbnamedb.createUser({
? ? 'user':'username',
? ? 'pwd':'password',
? ? 'roles':[{'role':'readWrite',db:'dbname'}]
})
mongo -u 用戶名 -p 密碼 --authenticationDatabase'dbname'
修改用戶信息
修改密碼
db.updateUser('username',{pwd:'newpassword'})
修改用戶名
db.updateUser('username',{user:'newusername'})
刪除權(quán)限
db.revokeRolesFromUser('username',[{role:'權(quán)限',db:'dbname'}])
添加權(quán)限
db.grantRolesToUser('username',[{role:'權(quán)限',db:'dbname'}])
刪除用戶
db.dropUser('username)
方式二
use admin
db.sysem.users.remove({user:'username'})
查看所有的用戶
use admin
db.system.users.find()
mongodb數(shù)據(jù)備份
mongodump -h 127.0.0.1:27017(本地可忽略) -d dbname -o 備份文件的路徑
mongodump備份數(shù)據(jù)庫下的集合
mongodump -h 127.0.0.1:27017(本地可忽略) -d dbname colname -o 備份文件的路徑
備份所有的數(shù)據(jù)庫
mongodump -h 127.0.0.1:27017(本地可忽略) -o 備份文件的路徑
恢復(fù)數(shù)據(jù)庫
mongorestore -h 127.0.0.1:27017(本地可忽略) -d dbname --dir 備份文件的路徑
恢復(fù)數(shù)據(jù)下的集合
mongorestore -h 127.0.0.1:27017(本地可忽略) -d dbname colname --dir 備份文件的路徑
恢復(fù)所有的數(shù)據(jù)庫
mongorestore -h 127.0.0.1:27017(本地可忽略) --dir 備份文件的路徑
數(shù)據(jù)的導(dǎo)出(json、csv)
導(dǎo)出json數(shù)據(jù)
mongoexport -d dbname -c colname -o ~/桌面/dump/名稱.josn --type json碍讯、csv
導(dǎo)出csv數(shù)據(jù)
mongoexport -d dbname -c colname -o ~/桌面/dump/名稱.csv --type csv -f '鍵名悬蔽,鍵名...'
導(dǎo)入數(shù)據(jù)(json、csv)
導(dǎo)入json數(shù)據(jù)
mongoimport -d dbname-c colname --file ~/桌面/dump/名稱.json --type json
導(dǎo)入csv數(shù)據(jù)
mongoimport -d dbname -c colname --file ~/桌面/dump/名稱.csv --type csv - filed'鍵名,鍵名...'
mongodb狀態(tài)檢測
mongostat
mongotop
副本集
目的:
1.防止數(shù)據(jù)災(zāi)害
2.實(shí)時備份捉兴,實(shí)現(xiàn)主從節(jié)點(diǎn)數(shù)據(jù)一致性
3.讀寫分離
4.無諾機(jī)行為
5.分擔(dān)主節(jié)點(diǎn)的壓力
缺點(diǎn):具有中心化蝎困,所有的增刪改操作都需要在主節(jié)點(diǎn)完成,
對主節(jié)點(diǎn)的壓力大倍啥,對主機(jī)的性能要求較高
如果實(shí)現(xiàn)副本集禾乘?
開始mongodb服務(wù)(至少倆個)
mongod --bind_ip ip --port port --dbpath 數(shù)據(jù)存放的路徑 --replSet res0
...
鏈接mongo服務(wù)
mongo -- host ip --port port
確定主節(jié)點(diǎn)
rs.initiate()
添加從節(jié)點(diǎn)
rs.add('ip:port')
激活從節(jié)點(diǎn)
rs.slaveOk()