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