MONGODB基操

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 -> db.colname.find({salary:{lt:3000}}) #返回所有工資小于3000的
lte -> db.colname.find({salary:{lte:3000}}) #返回所有工資小于等于3000的
gt -> db.colname.find({salary:{gt:3000}}) #返回所有工資大于3000的
gte -> db.colname.find({salary:{gte:3000}}) #返回所有工資大于等于3000的
ne -> db.colname.find({salary:{ne:3000}}) #返回所有工資不等于3000的

邏輯運(yùn)算符

or -> db.colname.find({:[{salary:{$gte:10000}},{name:"xxx"}}]})

范圍運(yùn)算符

in ->db.colname.find({age:{in:{19,20}}}) #返回年齡為19或20的文檔
nin ->db.colname.find({age:{nin:{19,20}}}) #返回年齡不為19或20的文檔

正則

db.colname.find.({name:/^李.?/}) #返回姓名是以李開頭的文檔
db.colname.find.({name:{$regex:"^李.
?"}})

自定義查詢

db.colname.find({$where:function(){ reture this.name=="麗麗"}})

聚合操作

groupproject matchskip limitunwind $sort

管道

db.colname.aggregate([{group:{_id:"class",count:{$sum:1}}}]) #以班級(jí)分組,返回各班的人數(shù)

db.colname.aggregate([{group:{_id:"class",average:{avg:"age"}}}]) #以班級(jí)分組,返回各班的平均年齡

db.colname.aggregate([{group:{_id:"class",max:{max:"age"}}}]) #以班級(jí)分組,返回各班的最大年齡
db.colname.aggregate([{group:{_id:"class",min:{min:"age"}}}]) #以班級(jí)分組,返回各班的最小年齡

db.colname.aggregate([{group:{_id:'class',names:{push:"name"}}}]) #以班級(jí)分組,返回各班的學(xué)生姓名

db.colname.aggregate([{group:{_id:"null",last:{last:"name"}}}]) #返回集合中的最后一個(gè)名字 db.colname.aggregate([{group:{_id:"null",first:{first:"name"}}}]) #返回集合中的第一個(gè)名字

db.colname.aggregate([{$project:{age:1,gender:1,_id:0}}]) #只返回年齡和姓名

db.colname.aggregate([{match:{age:{gt:50,$lt:100}}}]) #只返回年齡大于50,小于100的文檔

db.colname.aggregate([{match:{age:{gt:50,lt:100}}},{sort:{age:-1}}]) #只返回年齡大于50,小于100的文檔,并根據(jù)年齡做降序排序

unwind #將文檔中的鍵對(duì)應(yīng)的數(shù)組差分成單條獨(dú)立數(shù)據(jù) db.colname.aggregate([{unwind:"$tage"}])

db.colname.aggregate([{match:{age:{gt:50,lt:100}}},{skip:1},{$limit:1}]) #只返回年齡大于50,小于100的文檔,并跳過(guò)第一條,只返回一條

?。。?limitskip 有先后順序,(順序不同,結(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.不能命中索引的情況: innin 范圍運(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容