mongodb
安裝(你們不需要安裝,鏡像已經(jīng)存在)
Ubuntu
sudo apt-get install mongodb
Mac
brew install mongodb
啟動(dòng)
- 直接啟動(dòng)
sudo mongod
注意事項(xiàng):?jiǎn)?dòng)失敗
數(shù)據(jù)庫(kù)不存在 創(chuàng)建文件夾
/data/db權(quán)限不夠,添加
sudo
- 啟動(dòng)參數(shù)說(shuō)明
--port進(jìn)行設(shè)置默認(rèn)端口
--dbpath設(shè)置數(shù)據(jù)庫(kù)路徑
--config通過(guò)指定配置文件去啟動(dòng)mongodb,再配置文件中可以配置默認(rèn)端口、數(shù)據(jù)庫(kù)路徑等等
關(guān)閉
- 直接kill關(guān)閉(非常不推薦使用,最好不要使用)
sudo kill -9 進(jìn)程號(hào)
- 通過(guò)進(jìn)入數(shù)據(jù)庫(kù)中直接關(guān)閉
use admin
db.shutdownServer()
數(shù)據(jù)庫(kù)
顯示數(shù)據(jù)庫(kù)列表
show databases
// 或
show dbs
顯示當(dāng)前數(shù)據(jù)庫(kù)
db
進(jìn)入數(shù)據(jù)庫(kù)
use 數(shù)據(jù)庫(kù)名
創(chuàng)建數(shù)據(jù)庫(kù)
只要插入數(shù)據(jù)就自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)
刪除數(shù)據(jù)庫(kù)
// 前提
use db
// 刪除數(shù)據(jù)庫(kù)
db.dropDatabase()
集合(表)操作
創(chuàng)建集合
- 默認(rèn)情況下只要插入數(shù)據(jù)自動(dòng)創(chuàng)建集合
- 手動(dòng)創(chuàng)建集合
db.createCollection(集合名稱)
顯示集合列表
show collections
刪除集合
db.集合名.drop()
數(shù)據(jù)操作
創(chuàng)建
// 插入數(shù)據(jù),json串
db.my_coll.insert({
"a":"x",
"b":{
"q":"a",
"p":"b"
},
"c":[1,2,3]
})
// _id 如果不指定 _id 自動(dòng)生成 ObjectID
// 批量插入
data = [
{"test01":"val1"},
{"test02":"val2"},
{"a":{"p":"q"},"b":123}
]
db.my_coll.insertMany(data)
更新
默認(rèn)整體更新,如果需要局部更新需要使用
$set,默認(rèn)是僅更新一次,如果需要批量更新需要添加第三個(gè)參數(shù)multi
// 默認(rèn)更新是完整更新,也就是替換
db.stu.update(
// 更新條件
{
"name":"郭靖"
},
// 更新內(nèi)容
{
"age":88
}
)
// 局部更新
db.stu.update(
// 更新條件
{
"name":"黃蓉"
},
// 更新內(nèi)容
{
// 局部更新內(nèi)容
$set:{
"age":80
}
}
)
// 默認(rèn)情況下是只更新一次,如果需要批量更新,添加第三個(gè)參數(shù),multi 設(shè)置為True 就是批量更新
db.stu.update(
// 更新條件
{
"age":{$gt:20}
},
// 更新內(nèi)容
{
// 局部更新內(nèi)容
$set:{
"age":36
}
},
// 更新方式
{
multi:true
}
)
刪除
// 刪除
db.stu.remove(
// 刪除條件
{
"age":36
},
// 如果想僅僅刪一條
{
justOne:true
}
)
// 清空數(shù)據(jù)
db.stu.remove({})
保存
// 通過(guò) _id 查詢數(shù)據(jù)如果存在就更新,如果不存在就插入
db.my_test.save({
"_id":1,
"a":"b"
})
查詢
簡(jiǎn)單查詢
db.集合名.find()
復(fù)雜查詢
// 默認(rèn)查詢是 并
db.stu.find(
// 查詢條件
{
"hometown":"蒙古",
"age":20
}
)
// 比較運(yùn)算符($gt,$gte,$lt,$lte,$ne)
db.stu.find(
// 查詢條件
{
"age":{$gt:20}
}
)
// 邏輯運(yùn)算符 $or
db.stu.find(
// 查詢條件
{
"age":{$gt:20},
$or:[
{"hometown":"蒙古"},
{"gender":false}
]
}
)
// 范圍運(yùn)算符 $in,$nin
// 表示在列表中的
db.stu.find(
// 查詢條件
{
"age":{$in:[18,45]}
}
)
// 正則表達(dá)式
db.stu.find(
// 查詢條件
{
"name":/^黃/
}
)
db.stu.find(
// 查詢條件
{
"name":{$regex:"^黃"}
}
)
// 自定義查詢
db.stu.find(
// 查詢條件
{
$where: function(){
// 返回 true 表示符合條件
// this 表示當(dāng)前記錄
return this.age >= 18 && this.gender == false
}
}
)
高級(jí)查詢
// limit 和 skip
// 注意: 先 skip 再 limit 不管誰(shuí)先誰(shuí)后
db.stu.find().limit(2)
db.stu.find().skip(1)
db.stu.find().limit(2).skip(1)
db.stu.find().skip(1).limit(2)
// 投影 是否顯示數(shù)據(jù)
// 在不同的數(shù)據(jù)庫(kù)版本中 方式不同
db.stu.find(
// 查詢條件
{},
// 投影方式,顯示數(shù)據(jù)字段
{
"name":1
}
)
// 排序
// 參數(shù)1為升序排列
// 參數(shù)-1為降序排列
db.stu.find().sort(
{
age:-1,
hometown:1
}
)
// 統(tǒng)計(jì)個(gè)數(shù)
db.stu.find({條件}).count()
db.stu.count({條件}})
// 去除重復(fù)
// 第一個(gè)參數(shù)是去重的字段
// 第二個(gè)是查詢條件
db.stu.distinct('hometown',{age:{$gt:18}})
聚合,幫助我們統(tǒng)計(jì)的操作,查詢操作主要的目的是尋找數(shù)據(jù),聚合的目的統(tǒng)計(jì)數(shù)據(jù)
db.集合名稱.aggregate([
{
管道名 : {表達(dá)式}
},
{
管道名 : {表達(dá)式}
},
{
管道名 : {表達(dá)式}
},
...
])
$group 管道
$group就是按照字段進(jìn)行分組
指定分組的字段,字段名稱
// 基本表達(dá)式
// $push 表達(dá)式
db.stu.aggregate([
{
'$group' : {
// 指定分組字段,注意要引用數(shù)據(jù)字段必須添加 `$`
'_id':"$gender",
// 通過(guò)性別進(jìn)行分組,分別計(jì)算出來(lái)自的地區(qū)
// $push 會(huì)把分組內(nèi)容某個(gè)字段放入到列表中
// "家鄉(xiāng)列表":{$push:"$hometown"}
// $$ROOT 表示當(dāng)前的記錄本身
"記錄列表":{$push:"$$ROOT"}
}
}
]).pretty()
// $push 表達(dá)式
db.stu.aggregate([
{
'$group' : {
// null 表示把所有記錄作為一組數(shù)據(jù)
'_id':null,
"記錄列表":{$push:"$hometown"}
}
}
])
match 管道,過(guò)濾數(shù)據(jù), `match` 管道的查詢條件和find的查詢條件一致的
db.stu.aggregate([
{
'$match' : {
// 填寫過(guò)濾條件
age:{$gt:20}
}
},
{
'$group':{
"_id":"$gender",
"平均年齡":{$avg:"$age"}
}
}
])
$project 管道,類似于投影
db.stu.aggregate([
{
'$match' : {
// 填寫過(guò)濾條件
age:{$gt:20}
}
},
{
'$group':{
"_id":"$gender",
"平均年齡":{$avg:"$age"}
}
},
{
'$project':{
"_id":0,
"平均年齡":1
}
}
])
$sort
db.stu.aggregate([
{
'$match' : {
// 填寫過(guò)濾條件
age:{$gt:16}
}
},
{
'$group':{
"_id":"$hometown",
"平均年齡":{$avg:"$age"}
}
},
{
'$sort':{
// 1:升序
// -1:降序
'平均年齡':1
}
}
])
limit 和skip,有先后順序,誰(shuí)先誰(shuí)手按照數(shù)據(jù)流來(lái)看
db.stu.aggregate([
{
'$match' : {
// 填寫過(guò)濾條件
age:{$gt:16}
}
},
{
'$group':{
"_id":"$hometown",
"平均年齡":{$avg:"$age"}
}
},
{
'$limit':2
}
])
db.stu.aggregate([
{
'$match' : {
// 填寫過(guò)濾條件
age:{$gt:16}
}
},
{
'$group':{
"_id":"$hometown",
"平均年齡":{$avg:"$age"}
}
},
{
'$skip':1
}
])
db.stu.aggregate([
{
'$match' : {
// 填寫過(guò)濾條件
age:{$gt:16}
}
},
{
'$group':{
"_id":"$hometown",
"平均年齡":{$avg:"$age"}
}
},
{
'$skip':1
},
{
'$limit':2
}
])
$unwind,通過(guò)列表數(shù)據(jù)拆分?jǐn)?shù)據(jù)集
db.t2.aggregate([
{
'$unwind' : '$size'
}
])
// 默認(rèn)情況下 $unwind 拆分?jǐn)?shù)據(jù)會(huì)過(guò)濾 空數(shù)據(jù),空列表,不存在字段
db.t3.aggregate([
{
'$unwind' : {
// 指定拆分字段
path:"$size",
// 是否顯示 空數(shù)據(jù),空列表,不存在字段的數(shù)據(jù)
preserveNullAndEmptyArrays:true
}
}
])
索引,提高查詢效率,缺點(diǎn):插入,更新會(huì)降低速度
// 創(chuàng)建索引
db.t1.ensureIndex({
"name":1
})
// 查看索引列表
db.t1.getIndexes()
// 刪除索引
db.t1.dropIndex("name_1")
擴(kuò)展
- 服務(wù)器端會(huì)創(chuàng)建備份腳本
# mysql 備份說(shuō)明
mysqldump -uroot -p123456 數(shù)據(jù)名 | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
# mongodb
mongodump -h dbhost -d dbname -o dbdirectory | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
- 通過(guò) corntab 定時(shí)執(zhí)行腳本實(shí)現(xiàn)備份
注意: 不要手動(dòng) 拷貝 復(fù)制
啟動(dòng)用戶驗(yàn)證模式
啟動(dòng)方式
-
--auth參數(shù)啟動(dòng) - 通過(guò)配置文件添加
auth=true
驗(yàn)證模式
- 必須要有賬號(hào)
// 如果當(dāng)前mongodb中沒有任何賬號(hào)第一步先創(chuàng)建 root 賬號(hào)
use admin
// 創(chuàng)建root賬號(hào),一旦創(chuàng)建成功之后,就無(wú)法再創(chuàng)建,
db.createUser({
"user":"python",
"pwd":"123456",
roles:["root"]
})
- 先要進(jìn)行登錄
use admin
db.auth('python','123456')
- 創(chuàng)建普通賬號(hào)
db.createUser({
"user":"db_01",
"pwd":"123456",
roles:[
{
// 對(duì)哪個(gè)數(shù)據(jù)庫(kù)
"db":"db_01",
// 權(quán)限 read,write,readWrite
"role":"readWrite"
}
]
})
db.createUser({
"user":"db_02",
"pwd":"123456",
roles:[
{
// 對(duì)哪個(gè)數(shù)據(jù)庫(kù)
"db":"db_02",
// 權(quán)限 read,write,readWrite
"role":"readWrite"
}
]
})
- 刪除用戶
use admin
db.dropUser('用戶名')