mongodb 的總結(jié)

mongodb里面不需要創(chuàng)建表/集合,他自動就會有的。
1.安裝
2.mongodb服務(wù):
sudo service mongod/mongodb start
sudo service mongod/mongodb stop
sudo service mongod/mongodb restart
配置文件路徑 /etc/mongod.conf|mongodb.conf
3.連接:
mongo
mongo -h ip:prot
mongo --host ip --port port
4.mongodb的操作:
數(shù)據(jù)庫:
  show dbs
db
use dbaname
db.dropDatabase()
db.stats()
集合:
 db.createCollection('colname',屬性)
db.createCollection('colname')
db.createCollection('colname',{capped:true,size:字節(jié)大小,max:最大文檔數(shù)量})
db.colname.drop()

文檔的操作:
docment = {
name:'xxx',
age:20,
}
增:
db.colname.insert(docment)
db.colname.insert([docment,docment1,....])
db.colname.insertOne(docment)
db.colname.insertMany([docment,docment1,....])
刪除:
db.colname.remove({})
db.colname.remove({條件})
db.colname.remove({條件},1) -> db.colname.remove({條件},{justOne:true})
修改:

更新文檔中的某些鍵

db.colname.update({條件},{$set:{鍵:值}})

全文檔更新

db.colname.update({條件},{鍵:值})

全文檔更新(如果沒找到,則作為一條新的數(shù)據(jù)插入)

db.colname.update({條件},{鍵:值},{upsert:true})

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'}})
限制查詢:
db.colname.find({條件}).limit(num) - > db.colname.find({age:20,name:'xxx'}}).limit(3)
跳過:skip
db.colname.find({條件}).skip(num)
結(jié)合使用:(返回符合條件的結(jié)果,從num1開始,返回num2條數(shù)據(jù))
db.colname.find({條件}).skip(num1).limit(num2)
排序:sort?。ǎ保荷?,-1:降序)
db.colname.find({條件}).sort({鍵:方向})
投影:project (0:不顯示,1:顯示)
docment = {
_id:'xklsancniwknc'
name:'xxx',
age:20,
gender:'男',
class:'1804'
}
db.colname.find({},{name:1,age:1,_id:0})
db.colname.find({},{name:0})

distinct 去重

db.colname.distinct('鍵',{條件}) -> db.colname.distinct('age',{name:'lisi'})

count() 計算總數(shù)

db.colname.find().count()
db.colname.count({條件}) -> db.colname.find({條件}).count()

$type:返回所有鍵為字符串類型的文檔

db.colname.find({鍵:{$type:'string'}})

比較運算符

= -> db.colname.find({name:'xxx'}).count()
lt 小于 -> db.colname.find({salary:{lt:10000}}).count()
lte 小于等于 -> db.colname.find({salary:{lte:10000}}).count()
gt 大于gte 大于等于
$ne 不等于

邏輯運算符

or -> db.colname.find({or:[{salary:{$gt:10000}},{name:'liming'}]})

范圍運算符

in -> db.colname.find({age:{in:[19,23,30]}})
nin -> db.colname.find({age:{nin:[19,23,30]}})

正則查詢:(一定是字符竄)

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

聚合操作:

管道

groupproject matchskip limitunwind $sort

函數(shù)

sumavg maxmin pushlast first docment = { _id:'xklsancniwknc' name:'xxx', age:20, gender:'男', class_:'1804' }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_',minage:{min:'age'}}}])

$push: 根據(jù)班級進行分組,返回班級下所有同學的姓名,返回的是一個數(shù)組

db.colname.aggregate([{group:{_id:'class_',names:{push:'name'},ages:{push:'age'}])

last:返回集合總的最后一個name

db.colname.aggregate([{group:{_id:'null',last:{last:'$name'}}}])

first:返回集合總的第一個name

db.colname.aggregate([{group:{_id:'null',first:{first:'name'}}}])project (只返回年齡和性別)
db.colname.aggregate([{project:{age:1,gender:1,_id:0}}])match:過濾 (返回年齡在大于50,小于100)
db.colname.aggregate([{match:{age:{gt:50,lt:100}}}])sort 排序 (返回年齡在大于50,小于100,)
降序排列
db.colname.aggregate([{match:{age:{gt:50,lt:100}}},{sort:{age:-1,..}}])
升序排列
db.colname.aggregate([{match:{age:{gt:50,lt:100}}},{sort:{age:1,..}}])
unwind:將文檔中的鍵對應(yīng)的數(shù)組,拆分成單條獨立數(shù)據(jù) docment = { _id:'xklsancniwknc' name:'xxx', age:20, gender:'男', class_:'1804', tags:['python','人工智能','mongodb'] } db.colname.aggregate([{unwind:'$tags'}]) 結(jié)果如下:
docment = {
id:'xklsancniwknc'
name:'xxx',
age:20,
gender:'男',
class
:'1804',
tags:'python',
}
docment = {
id:'xklsancniwknc'
name:'xxx',
age:20,
gender:'男',
class
:'1804',
tags:'人工智能',
}
.....

skip與限制查詢

db.colname.aggregate([{match:{age:{gt:30}}},{limit:3}]) db.colname.aggregate([{match:{age:{gt:30}}},{skip:2}])
db.colname.aggregate([{match:{age:{gt:30}}},{skip:2},{limit:3}])

注意:skip與limit有先后順序(順序不同,會影響結(jié)果)

索引:(mongodb的索引存放在內(nèi)存中)

id索引:這個在插入文檔的會自動創(chuàng)建
普通索引:
單鍵索引:
   db.colname.createIndex({'索引鍵':方向})
  復(fù)合索引:
   db.colname.createIndex({'索引鍵':方向,'索引鍵':'方向',..})
子文檔索引:
{
class
:'1804',
students:{
name:'liming',
age:20,
email:'nxkj@qq.com'
adress:'北京'
}
}
db.colname.createIndex({'students.name':1,'students.email':-1})
db.colname.find({'students.name':'liming','students.email':'nxkj@qq.com'})
數(shù)組索引:
db.colname.createIndex({tags:1})
全文索引:(在一個集合中只能創(chuàng)建一個)
{
'content':'abc 123 李某某 1804 班'
}
db.colname.createIndex({content:'text',...})
使用
db.colname.find({text:{search:'關(guān)鍵詞'}})
屬性:
background 在后臺創(chuàng)建索引
unique 唯一索引
name 給索引起一個名稱
sparse 稀疏索引(if 設(shè)置了這個屬性,文檔中如果含有這個索引鍵,那么創(chuàng)建索引,else 不創(chuàng)建)
TTL expireAfterSeconds 秒 :改屬性設(shè)置文檔在集合中存活的時間,超時,則刪除
注意:(我們直接插入一個時間,會跟文檔中正真插入的時間,相差8小時。)
TTL補充:
_id 不能設(shè)置為日期索引
不能將已創(chuàng)建的索引直接修改為時間索引。只能刪除,重新創(chuàng)建
TTL不能是復(fù)合索引,只能是單鍵索引
在固定的集合中,不能創(chuàng)建TTL索引

刪除索引

db.colname.dropIndex('索引名')
db.colname.dropIndexes()

查看集合中的所有索引

db.colname.getIndexes()

查看集合中的索引的總大小

db.colname.totalIndexSize()

強制索引

db.colname.find({條件}).hint('索引名')

重建索引

db.colname.reIndex()

建立索引的注意事項、有點,缺點:

優(yōu)點:相當于創(chuàng)建了一個目錄,能夠提高查找的效率
缺點:1.對于插入、刪除、修改數(shù)據(jù)會變慢,因為在做插入、刪除、修改數(shù)據(jù)的時候,索引也會隨之變化,
這樣會降低效率 2.創(chuàng)建索引會產(chǎn)生額外的數(shù)據(jù),增加我們對硬件的要求,會額外占用內(nèi)存。
注意事項:
1.盡量減少創(chuàng)建不必要的索引
2.經(jīng)常變動的鍵不必要創(chuàng)建索引
3.不會成為查詢條件的值不需要創(chuàng)建索引
4.mongodb集合中最大的索引個數(shù)不能超過64個,
索引的名稱不能超過128個字符,符合索引最大只能有31個字段
5. 不能命中索引的情況:innin 范圍運算符,以及比較運算符。。。。。
6. mongodb中索引存放在內(nèi)存中,必須確保索引的大小不會超過內(nèi)存,
如果超過內(nèi)存最大限制,mongodb會自動刪除一些索引
創(chuàng)建用戶:

普通用戶、超級管理員

1.#創(chuàng)建超級管理員:
root:
read:
readWrite
use admin
db.createUser({
'user':'username',
'pwd':'password',
'roles':[{'role':'root',db:'admin'}]
})
2.#打開mongodb的安全設(shè)置
sudo vim /etc/mongod.conf

高版本

security:

authorization: enabled

2.1sudo vim /etc/mongodb.conf

低版本

auth=True

3.修改完畢之后重置:sudo service mongod|mongodb restart
4.使用超管登錄
mongo -u 用戶名 -p 密碼 --authenticationDatabase 'admin'
創(chuàng)建一個普通用戶
use dbname
db.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.system.users.remove({user:'username'})

查看所有的用戶

use admin
db.system.users.find()

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

mongodump -h 127.0.0.1:27017(本地可以省略) -d dbname -o 備份文件的路徑

mongodb備份數(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ù)的導出(json、csv)

導出json數(shù)據(jù)
mongoexport -d dbname -c colname -o ~/桌面/dump/名稱.json --type json
導出csv數(shù)據(jù)
mongoexport -d dbname -c colname -o ~/桌面/dump/名稱.csv --type csv -f '鍵名,鍵名...'

導入數(shù)據(jù)

導入json數(shù)據(jù)
mongoimport -d dbname -c colname --file ~/桌面/dump/名稱.json --type json
導入csv數(shù)據(jù)
mongoimport -d dbname -c colname --file ~/桌面/dump/名稱.csv --type csv -filed '鍵名,..' ????
mongoimport -d dbname -c colname --file ~/桌面/dump/名稱.csv --headerline --type csv

mongodb狀態(tài)檢測

mongostat
mongotop

副本集

目的:

1.防止數(shù)據(jù)災(zāi)難
2.實時備份,實現(xiàn)主從節(jié)點數(shù)據(jù)一致性
3.讀寫分離
4.無宕機行為
5.分擔主節(jié)點的壓力
缺點:具有中心化,所有的增刪改操作都需要在主節(jié)點完成,
對主節(jié)點的壓力較大,對主機的性能要求較高。

如何實現(xiàn)副本集?

開啟mongod服務(wù)(至少兩個)

mongod --bind_ip ip --port port --dbpath 數(shù)據(jù)存放的路徑 --replSet rs0
....

連接mongo服務(wù)

mongo --host ip --port port

確定主節(jié)點

rs.initiate()

添加從節(jié)點

rs.add('ip:port')

激活從節(jié)點

rs.slaveOk()

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

相關(guān)閱讀更多精彩內(nèi)容

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