數(shù)據(jù)庫相關(guān)
數(shù)據(jù)庫安裝和配置
安裝之后需要配置環(huán)境變量郑藏;
驗(yàn)證:mongo命令是否有效
啟動(dòng)服務(wù)端:
- C:User\Admintor(任意地址)> mongod --dbpath D:\DevelopSoft\mongolog;
說明:--dbpath 就是選擇數(shù)據(jù)庫文檔所在的文件夾,后面還可以附加--port 端口號(hào)從而指定啟動(dòng)端口(否則默認(rèn)是27017) - 如果在c盤根目錄下新建data/db兩級(jí)目錄镊辕,則可以直接使用mongod啟動(dòng)數(shù)據(jù)庫,但是如果這兩級(jí)目錄不存在則報(bào)錯(cuò)
- mongod:是開啟數(shù)據(jù)庫,不能關(guān)閉,一旦這個(gè)cmd關(guān)閉了牛,數(shù)據(jù)庫就關(guān)閉了
- 啟動(dòng)客戶端:然后另外開啟一個(gè)cmd,運(yùn)行mongo連接數(shù)據(jù)庫
查看
查看當(dāng)前數(shù)據(jù)庫名稱:db
查看所有數(shù)據(jù)庫:show dbs
切換數(shù)據(jù)庫:use 數(shù)據(jù)庫名稱 (如果數(shù)據(jù)庫不存在辰妙,則指向數(shù)據(jù)庫鹰祸,但不創(chuàng)建
直到插入數(shù)據(jù)或創(chuàng)建集合時(shí)數(shù)據(jù)庫才被創(chuàng)建)
默認(rèn)數(shù)據(jù)庫為test,如果你沒有創(chuàng)建新的數(shù)據(jù)庫密浑,集合將存放在test數(shù)據(jù)庫中
刪除數(shù)據(jù)庫:db.dropDatabase() 刪除的時(shí)當(dāng)前數(shù)據(jù)庫
結(jié)構(gòu)說明
數(shù)據(jù)庫->集合collection(可以多個(gè))->文檔document(可以多個(gè),文檔和文檔之間沒有聯(lián)系)
集合相關(guān)
創(chuàng)建集合
db.createCollection(name,options)
name時(shí)要?jiǎng)?chuàng)建的集合的名稱
options是一個(gè)文檔蛙婴,用于指定集合的配置,但是此配置可以沒有尔破,就代表無限制
限制集合大小
db.createCollection("sub",{capped:true,size:10})
capped :默認(rèn)是false表示不設(shè)置上限街图,值true表示設(shè)置上限
size: 當(dāng)capped值為true時(shí),需要指定此參數(shù)呆瞻,表示上限大小焊傅,當(dāng)文檔達(dá)到上限
時(shí)柴我,會(huì)將之前的數(shù)據(jù)覆蓋,單位為字節(jié)
查看當(dāng)前數(shù)據(jù)庫的集合
show collections
刪除
db.集合名稱.drop()
數(shù)據(jù)類型
Object ID:文檔id 不需要維護(hù)期贫,作為主鍵
String:字符串梳星,必須是有效的utf-8
Boolean:存儲(chǔ)一個(gè)布爾值 true或false
Integer:整數(shù)可以是32或64位赞赖,這取決于服務(wù)器
Double:存儲(chǔ)浮點(diǎn)數(shù)
Arrays:數(shù)組或列表,多個(gè)值存儲(chǔ)到一個(gè)鍵
Object:用于嵌入式的文檔冤灾,即一個(gè)值為一個(gè)文檔
Null:存儲(chǔ)null值
Timestamp:時(shí)間戳
Date:存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式
插入
- 插入一個(gè)文檔對(duì)象/只能是一個(gè)對(duì)象
db.colletion.insertOne() - 插入多個(gè)文檔對(duì)象/只能是數(shù)組
db.colletion.insertMany() - 插入一個(gè)或者多個(gè)/數(shù)組或者對(duì)象
db.colletion.insert()
db.集合名稱.insert(document)
插入文檔時(shí)候前域,如果不指定_id參數(shù),mongdb會(huì)為文檔分配一個(gè)唯一的objectid
案例:
栗子1:db.stu.insert({name:'a',gender:1})
栗子2:
s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
# 插入多個(gè)(傳入的是數(shù)組)
db.hehe.insert([{info:"asa"},{name:"asas"}])
# 簡單查詢
db.集合名稱.find()
- 查詢韵吨,如果多個(gè)則只顯示第一個(gè)
db.colletion.findOne({name:"b"})
- 查詢匿垄,返回的是數(shù)組,所以可以利用[]索引
db.colletion.find({name:"b"})[0]
- 還可以在find的結(jié)果后面加上归粉,count()/length()等方法
db.colletion.find({name:"b"}).length()
# 更新
db.集合名稱.update(
<query>,
<update>,
{multi:<boolean>}
)
參數(shù)query:查詢條件椿疗,類似sql語句update中的where部分
參數(shù)update:更新操作符,類似sql語句中的set部分
參數(shù)multi:可選糠悼,默認(rèn)是false届榄,表示只更新找到的第一條記錄,值為true表示條件滿足的全部更新
- 默認(rèn)會(huì)使用新對(duì)象替換舊對(duì)象(默認(rèn)只會(huì)替換一個(gè))倔喂,此時(shí)參數(shù)二替換了參數(shù)一在數(shù)據(jù)庫中
db.colletion.update({name:"b"},{age:20})
解決方案1:這樣就只會(huì)更新對(duì)應(yīng)的屬性铝条,還不是替換
db.colletion.update({name:"b"},{$set:{age:20})
解決方案2:或者使用replaceOne,其不會(huì)整體替換
db.collection.replaceOne({name:"sdc"},{name:"sdasa"})
- 只修改第一個(gè)符合條件的文檔
db.colletion.updateOne()
- 同時(shí)修改符合多個(gè)條件的文檔
db.colletion.updateMany()
栗子1:全文檔更新,參數(shù)一為空靖苇,表示全部數(shù)據(jù)都匹配
db.stu.update({},{name:'mnc'})
此時(shí)只修改了第一條,但是第一條數(shù)據(jù)整個(gè)文檔結(jié)構(gòu)都變了
例如:修改前時(shí){"_id":ObjectId("523bjj24bk23"),"name":"gj1","gender":true}
修改之后:{"_id":ObjectId("523bjj24bk23"),"name":"gj1"}
為了避免上面的情況,通過$set進(jìn)行指定屬性的更新
先插入一條數(shù)據(jù):db.stu.insert({name:"hr",gender:0})
修改:db.stu.update({name:'hr'},{$set:{name:'hys'}})
這樣修改就不會(huì)造成班缰,整個(gè)文檔的改變
修改多條匹配到的數(shù)據(jù)
db.stu.update({},{$set:{gender:0}},{multi:true})
- $unset是根據(jù)參數(shù)一匹配贤壁,然后刪除匹配到的第一條的name:"asdcjnacsasca"屬性,注意不是刪除整條埠忘,而且只匹配第一條age:20的document
db.colletion.update({age:20},{$unset:{name:"asdcjnacsasca"}})
保存
db.集合名稱.save(document)
如果文檔的_id已經(jīng)存在則是修改芯砸,如果文檔_id不存在則添加
栗子:db.stu.save({_id:'20160102','name':'zq',gender:1})
刪除
db.集合名稱.remove(
<query>,
{
justOne:<boolean>
}
)
query:可選,刪除的文檔的條件
justOne:可選给梅,如果設(shè)為true或1假丧,則只刪除一條,默認(rèn)false动羽,刪除多條
栗子:
刪除第一條:db.stu.remove({gender:0},{justOne:true})
全部刪除:
db.stu.remove({}) 一條條刪除包帚,性能低
db.stu.drop() 整體刪除,性能高
- 只刪除一個(gè)符合條件的文檔
- db.collection.deleteOne()
- 刪除所有符合的文檔
db.collection.deleteMany()
查詢
db.集合名稱.find({條件文檔})
db.集合名詞.findOne({條件文檔}) 只返回第一個(gè)
db.集合名稱.find({條件文檔}).pretty() 將結(jié)果格式化
補(bǔ)充
- 多級(jí)結(jié)構(gòu)
db.hehe.insert(
[
{
name:"asads",
fav:{
movie:["a","b"]
}
}
]
)
- 給movie新加一個(gè)"星際穿越"
db.hehe.update({name:"asads"},{$push:{
"fav.movie":"星際穿越"
}})
說明:$set是整體替換运吓,但是此時(shí)想新增渴邦,所以使用$push
還有Bson支持.的形式調(diào)用,但是必須被“”包裹起來拘哨。
同理還有$pop,$pull,$addToSet(和$set相似谋梭,但是不能重復(fù)添加)),$pushAll.$pullAll
插入兩萬條數(shù)據(jù)
var infos=[]
for(var i=0;i<20000;i++){
infos.push({age:i})
}
db.hehe.insert(infos)
這樣想比與一條條插入性能高了很多查詢年紀(jì)在20和50之間的數(shù)據(jù)
db.hehe.find({age:{lt:50}})
修改年紀(jì)為1的數(shù)據(jù)增加20(如果減20則age:-20即可)
db.hehe.updateMany({age:1},{$inc:{age:20}})
運(yùn)算符
等于 默認(rèn)是等于判斷,沒有運(yùn)算符
小于lte
大于 gte
不等于 gte:18}})
邏輯運(yùn)算符
查詢時(shí)可以有多個(gè)條件倦青,多個(gè)條件之間需要通過邏輯運(yùn)算符連接
邏輯與:默認(rèn)是邏輯與的關(guān)系
栗子:查詢年級(jí)大于等于18瓮床,并且性別為1的學(xué)生
db.stu,find({age:{$gte:18},gender:1})
邏輯或:使用or:[{age:{$gt:18}},{gender:1}]})
and和or一起使用
查詢年齡大于18或性別為0的學(xué)生产镐,并且學(xué)生的姓名為gj
db.stu.find({gt:18}},{gender:1}],{name:'gj'})
范圍運(yùn)算符
使用nin判斷是否在某個(gè)范圍
查詢年齡為18,28的學(xué)生,注意不是區(qū)間隘庄,指的是18/28只要有一個(gè)就符合
db.stu.find({age:{$in:[18,28]}})
全部匹配all
使用all:[18,28]}})
正則表達(dá)式
使用//或regex:'^黃'}})
自定義查詢
使用where:function(){return this.age>20}})
數(shù)據(jù)查詢
方法limit():用于讀取指定數(shù)量的文檔
db.集合名稱.find().limit(number)
參數(shù)number表示要獲取的文檔的條數(shù)述雾,如果不指定則顯示所有
查詢2條學(xué)生的數(shù)據(jù)
db.stu.find().limit(2)
方法skip():用于跳過指定數(shù)量的文檔
db.集合名稱.find().skip(number)
參數(shù)number表示跳過的記錄條數(shù)街州,默認(rèn)是0
查詢從第三條開始的學(xué)生信息
db.stu.find().skip(2)
上面兩個(gè)可以一起使用,不分先后順序
查詢第5至8條數(shù)據(jù)
db.stu.find().limit(4).skip(5)或
db.stu.find().skip(5).limit(4)
投影
在查詢到得返回結(jié)果中玻孟,只選擇必要得字段唆缴,而不是選擇一個(gè)文檔的整個(gè)字段
參數(shù)為字段與值,值為1表示顯示取募,值為0不顯示
db.集合名稱.find({},{字段名稱:1,.....})
排序
db.集合名稱.find().sort({字段:1,....})
參數(shù)1為升序排列
參數(shù)-1為降序排列
栗子:db.stu.find().sort({gender:-1,age:-1})
統(tǒng)計(jì)個(gè)數(shù)
方法count()用于統(tǒng)計(jì)結(jié)果集中文檔條數(shù)
db.集合名稱.find({條件}).count()
或者
db.集合名稱.count({條件})
消除重復(fù)
方法distinct()對(duì)數(shù)據(jù)去除重復(fù)
db.集合名稱.distinct('去重字段',{條件})
栗子:查找年齡大于18的性別(去重)
db.stu.distinct(gender,{age:{$gt:18}} )
高級(jí)操作
聚合 aggregate
db.集合名稱.aggregate([{管道:{表達(dá)式}])
常用管道:
match: 過濾數(shù)據(jù),只輸出符合條件的文檔
sort:將輸入文檔排序后輸出
skip:跳過指定數(shù)量的文檔织阳,并返回余下的文檔
$unwind:將數(shù)組類型的字段進(jìn)行拆分
針對(duì)Mongodb4.x
安裝
- 新增選擇是網(wǎng)絡(luò)用戶還是本地用戶
- 會(huì)選擇log文件夾和文件文件夾
- 而且會(huì)注冊(cè)系統(tǒng)服務(wù)眶蕉,不需要在mongod手動(dòng)開啟服務(wù)端
Mongdb賬戶權(quán)限配置
默認(rèn)是全部開啟,不需要用戶名和密碼唧躲,不安全
- 創(chuàng)建超級(jí)管理員
use admin
db.createUser({
user:'admin',
pwd:'123456',
roles:[{role:'root',db:'admin'}]
})
- 修改Mongodb數(shù)據(jù)庫配置文件
D:\DevelopSoft\MongoDB\bin\mongod.cfg
- 配置:默認(rèn)
如下開啟后造挽,才必須要求通過賬號(hào)密碼鏈接,mongodb默認(rèn)是可以直接鏈接的
security:
authorization: enabled 注意空格和編碼以及換行符
- 修改配置文件后重新啟動(dòng)mongodb服務(wù)
- 使用超級(jí)管理員連接數(shù)據(jù)庫
mongo admin -u 用戶名 -p 密碼
mongo 192.168.0.117:27017/test -u user -p password //遠(yuǎn)程連接
- 創(chuàng)建指定用戶弄痹,只能訪問指定數(shù)據(jù)庫
use zengqiangdb
db.createUser({
user:'zengqiang',
pwd:'123456',
roles:[{role:'dbOwner',db:'zengqiangdb'}]
})
數(shù)據(jù)庫角色
- 數(shù)據(jù)庫用戶角色: read readWriter
- 數(shù)據(jù)庫管理角色: dbAdmin dbOwner userAdmin
- 集群管理角色: clusterAdmin clusterManager cluserMonitor hostManager
- 備份恢復(fù)角色: backup restore
- 所有數(shù)據(jù)庫角色: readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase
- 超級(jí)用戶角色: root
相關(guān)命令
- show users:查看當(dāng)前庫的管理員
- db.dropUser("zengqiang"):刪除管理員
- db.updateUser("zengqiang",{pwd:"password"}):修改用戶密碼
- db.auth("admin","password"):密碼認(rèn)證
例如:直接mongo admin連接不輸入任何密碼則show dbs是無效的饭入,此時(shí)可以通過密碼認(rèn)證完成密碼認(rèn)證再show dbs等操作即可有效
Linux相關(guān)
Mongodb4.x 安裝
- 配置 yum 源
- 在路徑/etc/yum.repos.d/下創(chuàng)建文件 mongodb-org-4.0.repo
- cd /etc/yum.repos.d/
- touch mongodb-org-4.0.repo
- 在文件 mongodb-org-4.0.repo 中寫入如下內(nèi)容(下面內(nèi)容可以直接復(fù)制,也可以復(fù)制官方文檔)
- [mongodb-org-4.0]
- name=MongoDB Repository
- baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
- gpgcheck=1
- enabled=1
- gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
- yum 安裝 mongodb(會(huì)安裝 mongodb-org 包及其依賴包mongodb-org-server肛真、mongodb-org-mongos谐丢、mongodb-org-shell、mongodb-org-tools)
數(shù)據(jù)庫實(shí)例默認(rèn)在/var/lib/mongo 路徑下蚓让,日志默認(rèn)在/var/log/mongodb 路徑下乾忱,也可以通過修改配置文件/etc/mongod.conf 文件的 storage.dbPath 和 systemLog.path 配置
- 安裝 mongodb
- yum install -y mongodb-org
- 開啟 mongodb 服務(wù)
- systemctl start mongod
- 設(shè)置開機(jī)啟動(dòng) mongodb
- systemctl enable mongod
- 停止 mongodb 服務(wù)
- systemctl stop mongod
- 重啟 mongodb 服務(wù)
- systemctl restart mongod
Mongodb4.x 卸載
- 停止服務(wù)
- service mongod stop
- 刪除安裝的包
- rpm -qa | grep mongodb-org 列出所有的包
- yum remove -y $(rpm -qa | grep mongodb-org)
- 刪除數(shù)據(jù)及日志
- rm -r /var/log/mongodb
- rm -r /var/lib/mongo
遠(yuǎn)程連接 mongodb
- 修改 mongo.conf 文件
- 命令:sudo vi /etc/mongod.conf
- 將原來 bindIp:127.0.0.1 修改為 0.0.0.0
- (mongodb 的配置文件中的 bind_ip 默認(rèn)為 127.0.0.1,默認(rèn)只有本機(jī)可以連接历极。 此時(shí)窄瘟,需要將 bind_ip配置為 0.0.0.0,表示接受任何 IP 的連接趟卸。)
- 重啟動(dòng) mongo 服務(wù):service mongod restart
- 永久開放 27017 端口:
- firewall-cmd --zone=public --add-port=27017/tcp --permanent ; (–permanent 永久生效蹄葱,沒有此參數(shù)重啟后
失效 - firewall-cmd --reload
- firewall-cmd --zone=public --add-port=27017/tcp --permanent ; (–permanent 永久生效蹄葱,沒有此參數(shù)重啟后
mongodb數(shù)據(jù)庫的導(dǎo)出導(dǎo)入
在 Mongodb 中我們使用 mongodump 命令來備份 MongoDB 數(shù)據(jù)。該命令可以導(dǎo)出所有數(shù)據(jù)到指定目錄中衰腌。 mongodump 命令可以通過參數(shù)指定導(dǎo)出的數(shù)據(jù)量級(jí)轉(zhuǎn)存的服務(wù)器新蟆。使用 mongorestore 命令來恢復(fù)備份的數(shù)據(jù)。
導(dǎo)出:
mongodump -h dbhost -d dbname -o dbdirectory
導(dǎo)入:(dbName對(duì)應(yīng)數(shù)據(jù)庫不存在則會(huì)自動(dòng)創(chuàng)建)
mongorestore -h dbhost -d dbname
<path>
如果開啟了用戶名驗(yàn)證
導(dǎo)入:
mongorestore -u admin -p 123456 -h dbhost -d --authenticationDatabase admin dbname
<path>
其中--authenticationDatabase admin代表使用的權(quán)限等級(jí)