增
db.colname.insert()
刪
db.colname.remove()
改
db.colname.update({條件},{$set:{key:value}})
db.colname.update({條件},{key:value})
db.colname.save({_id:"",key:value,key:value,key:value})#如果該_id存在就修改該文檔,不存在就添加
查
db.colname.find() -> db.colname.find({})
db.colname.find({條件}) -> db.colname.find({age:20,name:"xxx"})
限制查詢
db.colname.find({條件}).limit(num) -> db.colname.find({age:20,name:"xxx"}).limit(3)
跳過(guò)
db.colname.find({條件}).skip(num).limit(num) #返回符合條件的結(jié)果,跳過(guò)幾條,返回幾條
排序
db.colname.find({條件}).sort({key:1|-1}) #1表示升序,-1表示降序
投影
db.colname.find({},{key1:1,key2:1,_id:0}) #為0的key不顯示,為1的key顯示
distinct 去重
db.colname.distinct("鍵",{條件}) -> db.colname.distinct("age",{name:"麗麗"})
count()
db.colname.find().count()
db.colname.count({條件}) ->db.colname.find({條件}).count()
$type
db.colname.find({鍵:{$type:"string"}}) #返回所有鍵為字符串類型的文檔
比較運(yùn)算符
lt:3000}}) #返回所有工資小于3000的
lte:3000}}) #返回所有工資小于等于3000的
gt:3000}}) #返回所有工資大于3000的
gte:3000}}) #返回所有工資大于等于3000的
ne:3000}}) #返回所有工資不等于3000的
邏輯運(yùn)算符
:[{salary:{$gte:10000}},{name:"xxx"}}]})
范圍運(yùn)算符
in:{19,20}}}) #返回年齡為19或20的文檔
nin:{19,20}}}) #返回年齡不為19或20的文檔
正則
db.colname.find.({name:/^李.?/}) #返回姓名是以李開頭的文檔
db.colname.find.({name:{$regex:"^李.?"}})
自定義查詢
db.colname.find({$where:function(){ reture this.name=="麗麗"}})
聚合操作
project
skip
unwind $sort
管道
db.colname.aggregate([{class",count:{$sum:1}}}]) #以班級(jí)分組,返回各班的人數(shù)
db.colname.aggregate([{class",average:{
age"}}}]) #以班級(jí)分組,返回各班的平均年齡
db.colname.aggregate([{class",max:{
age"}}}]) #以班級(jí)分組,返回各班的最大年齡
db.colname.aggregate([{class",min:{
age"}}}]) #以班級(jí)分組,返回各班的最小年齡
db.colname.aggregate([{class',names:{
name"}}}]) #以班級(jí)分組,返回各班的學(xué)生姓名
db.colname.aggregate([{last:"
group:{_id:"null",first:{
name"}}}]) #返回集合中的第一個(gè)名字
db.colname.aggregate([{$project:{age:1,gender:1,_id:0}}]) #只返回年齡和姓名
db.colname.aggregate([{gt:50,$lt:100}}}]) #只返回年齡大于50,小于100的文檔
db.colname.aggregate([{gt:50,
sort:{age:-1}}]) #只返回年齡大于50,小于100的文檔,并根據(jù)年齡做降序排序
unwind:"$tage"}])
db.colname.aggregate([{gt:50,
skip:1},{$limit:1}]) #只返回年齡大于50,小于100的文檔,并跳過(guò)第一條,只返回一條
?。。?
skip 有先后順序,(順序不同,結(jié)果不同)
索引 (mongodb的索引放在內(nèi)存里)
_id索引 插入文檔里自動(dòng)創(chuàng)建
普通索引:
單鍵索引:
db.colname.createIndex({"索引鍵":方向})
復(fù)合索引:
db.colname.createIndex({"索引鍵":方向,"索引鍵":方向})
子文檔索引:
db.colname.createIndex({"父鍵.子鍵":方向,"父鍵.子鍵":方向})
數(shù)組索引:
db.colname.createIndex({tags:1})
全文索引:(在一個(gè)集合中只能創(chuàng)建一個(gè)全文索引)
db.colname.createIndexI({"索引鍵":"text"})
db.colname.find({$text:{$search:"關(guān)鍵字"}})
屬性:
background:在后臺(tái)創(chuàng)建索引
unique: 唯一suoy
name: 為索引起名字
sparse:稀疏索引(創(chuàng)建一個(gè)索引,如果設(shè)置了sparse,文檔中如果含有這個(gè)索引鍵,創(chuàng)建索引,沒(méi)有索引鍵,跳過(guò)這個(gè)文檔)
#TTL exprieAfterSeconds 設(shè)置文檔在集合中的存活時(shí)間,超時(shí)刪除該文檔
#!注意:我們直接插入一個(gè)時(shí)間,會(huì)跟著文檔中真正插入的時(shí)間,相差8小時(shí)
#_id不能設(shè)置日期索引
#不能將已經(jīng)創(chuàng)建的索引直接修改為時(shí)間時(shí)間索引,只能刪除,重新創(chuàng)建
#TTL不能是復(fù)合索引,只能是單鍵索引
#在固定大小的集合中,不能創(chuàng)建TTL索引
刪除索引
db.colname.dropIndex("索引名") #刪除一個(gè)索引
db.colname.dropIndexes() #刪除所有索引
查看索引
db.colname.getIndexes() #查看集合中的所有索引
查看集合中索引的總大小
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)建了一個(gè)目錄,能夠提高查找的效率
缺點(diǎn):1 對(duì)于插入 刪除 修改數(shù)據(jù)會(huì)變慢,因?yàn)樵谧霾迦?,刪除,修改數(shù)據(jù)的時(shí)候,索引也會(huì)隨之變化。
2 創(chuàng)建索引會(huì)產(chǎn)生額外的數(shù)據(jù),增加我們對(duì)硬件的要求,會(huì)額外占用內(nèi)存
注意事項(xiàng):
1.盡量減少創(chuàng)建不必要的索引
2.經(jīng)常變動(dòng)的鍵不必要?jiǎng)?chuàng)建索引
3.不會(huì)成為查詢條件的值不需要?jiǎng)?chuàng)建索引
4.mongodb集合中最大的索引個(gè)數(shù)不能超過(guò)64個(gè),索引的名稱不能超過(guò)128個(gè)字符,復(fù)合索引最大只能有31個(gè)字段
5.不能命中索引的情況: nin 范圍運(yùn)算符 以及比較運(yùn)算符
6.mongodb中索引存放在內(nèi)存中,如果必須確保索引的大小不能超過(guò)內(nèi)存,如果超過(guò)內(nèi)存的最大限制,mongodb會(huì)自動(dòng)刪除一些索引
6.mongodb中索引存放在內(nèi)存中,如果必須確保索引的大小不能超過(guò)內(nèi)存,如果超過(guò)內(nèi)存的最大限制,monogdb會(huì)自動(dòng)輸出一些索引
創(chuàng)建用戶
use admin
db.createUser({"user":"username","pwd":"password","roles":[{"role":"root",db:"admin"}]})
#打開安全認(rèn)證
sudo vim /etc/mongod.conf
#低版本
#auth=True
修改完畢后重置 sudo service mongod restart
#使用超管登錄
mongo -u 用戶名 -p 密碼 --authenticationDatabase "admin"
use dbname
db.createUser({"user":"username","pwd":"password","roles":[{"role":"readWrite",db:"dbname"}]})
mongo -u 用戶名 -p 密碼 --authenticationDatabase "dbname"
修改用戶信息
db.updateUser("username",{pwd:"newpwd"}) #改密碼
db.updateUser("username",{user:"newuser"}) #修改用戶名
刪除權(quán)限
db.revokeRolesFromUser("username",[{role:"權(quán)限",db:"dbname"}])
添加權(quán)限
db.grantRolesToUserI("username",db:"dbname")
刪除用戶
db.dropUser("username")
use admin
db.system.users.remove({user:"username"})
查看所有的用戶
use admin
db.system.users.find()
mongodb數(shù)據(jù)備份
monogodump -h 127.0.0.1:27017 -d dbname -o 備份文件路徑
monogodump -h 127.0.0.1:27017 -d dbname colname -o 備份文件路徑 (集合)
mongodb數(shù)據(jù)恢復(fù)
mongorestore -h 127.0.1:27017 -d dbname --dir 備份文件路徑
備份所有數(shù)據(jù)庫(kù)
monogodump -h 127.0.0.1:27017 -o 備份文件路徑
恢復(fù)所有數(shù)據(jù)庫(kù)
mongorestore -h 127.0.0.1:27017 --dir 備份文件路徑
數(shù)據(jù)導(dǎo)出(json,csv)
mongoexport -d dbname -c colname -o 導(dǎo)出文件路徑(.json) --type json
mongoexport -d dbname -c colname -o 導(dǎo)出文件路徑(.csv) --type csv -f "鍵名,鍵名"
數(shù)據(jù)導(dǎo)入(json,csv)
mongoimport -d dbname -c colname --file 導(dǎo)入文件路徑 --type json
mongoimport -d dbname -c colname -- file 導(dǎo)入文件路徑 --headerline --type csv
mongodb狀態(tài)檢測(cè)
mongostat
mongotop
副本集
目的
1.防止數(shù)據(jù)災(zāi)難
2.實(shí)時(shí)備份,實(shí)現(xiàn)主從節(jié)點(diǎn)數(shù)據(jù)一致性
3.讀寫分離
4.無(wú)宕機(jī)行為
5.分擔(dān)主節(jié)點(diǎn)壓力
缺點(diǎn):具有中心化,所有的增刪改查都需要在主節(jié)點(diǎn)完成,對(duì)主節(jié)點(diǎn)的壓力較大,對(duì)主機(jī)的性能要求較高
如何實(shí)現(xiàn)副本集
開啟mongod服務(wù)(至少兩個(gè))
mongod -bind_ip ip --port port --dbpath 數(shù)據(jù)存放路徑 --replSet rs0
鏈接mongo服務(wù)
mongo --host ip --port port
確定主節(jié)點(diǎn)
rs.initiate()
添加從節(jié)點(diǎn)
rs.add("ip:port")
激活從從節(jié)點(diǎn)
rs.slaveOk()