資料庫mongodb基本操作總結筆記
阿新 • • 發佈:2018-12-24
1. 安裝
- Mac
brew install mongodb
- Ubuntu
sudo apt-get install mongodb
2.啟動和關閉
- 啟動
1.服務啟動(sudo apt-get install mongodb安裝可以)
sudo service mongodb start
2.直接啟動(開發階段使用這種方案啟動)
sudo mongod
【注意事項】:
- 資料庫檔案找到引發的錯誤 Data directory /data/db not found., terminating
sudo mkdir /data
sudo mkdir /data/db
- 許可權不夠新增sudo
- 可能虛擬機器的硬碟大小太小了,小到mongodb不允許你啟動
sudo mongod --smallfiles
- 啟動引數:
--dbpath 資料庫檔案路徑 預設/data/db
--port 設定監聽埠 預設27017
--bind_ip 允許訪問的IP地址
--auth 啟動驗證模式
--config指定配置檔案,把所有的相關配置都放到配置檔案中
- 關閉
1.服務關閉
sudo service mongodb stop
2.直接關閉
# 1. ctrl + C # 2. 登入到mongodb中退出 use admin db.shutdownServer() # 3. kill 程序(不推薦使用,特別是線上的資料庫)
3 操作基本資料庫
利用客戶端進行登入
# 伺服器啟動,
sudo mongod
# 進行客戶端登入
mongo
資料庫操作
列出資料庫
show dbs/databases
建立資料庫
use 資料庫
// 插入資料即可建立
刪除資料庫
use 資料庫
db.dropDatabase()
資料表操作(table => collection)
- 表顯示資料庫中的集合列
show collections
- 建立集合
// 1. 插入資料即建立 db.集合名稱.insert({"a":"b"}) // 2. 建立集合不建立資料 db.createCollection('mycoll')
- 刪除集合
db.集合名稱.drop()
- 集合重新命名
db.集合名稱.renameCollection('新的集合名稱')
資料庫表中資料操作(collection中資料操作)
- 增
// mongodb內部的指令碼是一套 類似於語法 javascript引擎
// 單條資料插入
db.mycoll.insert(
{
"a":5,
"b":"abc",
"c":['q','w','e'],
"d":{
"h":"u"
}
}
)
// 多條資料插入
data = [
{"x":"b"},
{"y":"d"}
]
db.集合名.insertMany(data)
- 改
【注意】,預設更新是整體更新,區域性更新使用$set,預設更新只更新一條,如果要批量更新就新增第三個引數{multi:true}
// 整體更新
db.stu.update(
// 更新條件
{
"hometown":"蒙古"
},
// 更新內容
{
"name":"傳智播客"
}
)
// 區域性更新
db.stu.update(
// 更新條件
{
"hometown":"桃花島"
},
// 更新內容
{
$set:{
"name":"黑馬"
}
}
)
// 批量更新
db.stu.update(
// 更新條件
{
"age":18
},
// 更新內容
{
$set:{
"name":"python16期"
}
},
// 更新方式
{
multi:true
}
)
- 刪
// 通過刪除條件進行刪除
db.stu.remove(
// 刪除條件
{
age:18
},
// 刪除方式
{
justOne:true
}
)
// 清空資料
db.stu.remove({})
- 儲存
按照_id欄位進行判定,如果存在就進行更新,如果不存在就插入
db.stu.save(
{
"_id":6,
"a":5,
"b":7
}
)
- 查
查詢的基本語法,預設是並級
// 基本查詢
db.stu.find(
// 設定查詢條件
{
"age":18,
"hometown":"蒙古"
}
)
運算子
- 比較運算子
## 大於$gt,大於等於$gte,小於$lt,小於等於$lte,不等於$ne
db.stu.find(
// 設定查詢條件
{
"age":{$gt:18}
}
)
- 邏輯運算子
預設是並,或$or
db.stu.find(
{
$or:[
{"age":18},
{"hometown":"蒙古"}
],
"name":"華箏"
}
)
- 範圍運算子
$in
,$nin
,表示內容的值(不)在列表中的查詢出來
db.stu.find(
{
age:{$nin:[18,45]}
}
)
- 支援正則表示式
// 1. /正則內容/ -> js正則表示式寫法
db.stu.find(
{
name:/^黃/
}
)
// 2. 通過正則表示式關鍵詞`$regex`
db.stu.find(
{
name:{$regex:"^黃"}
}
)
- 自定義查詢條件
db.stu.find(
{
$where: function(){
// 返回 true 或者 false,如果是 true 表示符合條件,如果是false表示不符合條件
// this 表示當前記錄物件
if (this.age > 18 && this.age < 40) {
return true
} else {
return false
}
}
}
)
limit 和 skip
- limit 顯示記錄數
- skip 跳過記錄數
【注意】如果skip和limit同時使用,不管誰在前面都是先skip在limit
db.stu.find().limit(1)
db.stu.find().skip(1)
db.stu.find().limit(3).skip(2) == db.stu.find().skip(2).limit(3)
投影
讓我們顯示需要的欄位,只要添加了投影條件就預設欄位都不顯示,只有設定欄位為 1 的才會顯示,_id預設都顯示,如果想讓_id不顯示可以設定為0
db.stu.find(
// 查詢條件
{},
// 投影-> 顯示欄位
{
name:1,
"_id":0
}
)
排序
升序設定為 1,降序設定為-1
db.stu.find().sort(
// 排序條件
{
age:-1
}
)
統計個數
// 寫法一
db.stu.find({查詢條件}).count()
// 寫法二
db.stu.count({查詢條件})
消除重複
關鍵詞distinct()
db.stu.distinct(
// 去重欄位
'hometown',
// 過濾條件
{
age:{$gt:18}
}
)
聚合
查詢和聚合搜尋資料,查詢資料更加關注於查詢資料本身,聚合關注於統計資料
基本語法
db.集合名稱.aggregate([
{管道名稱 : {表示式}},
{管道名稱 : {表示式}},
{管道名稱 : {表示式}},
...
])
- 管道名稱
- $group
- $match
- $project
- $sort
- $limit
- $skip
- $unwind
- 表示式(進行操作)
- $sum 統計數量
- $avg 統計平均年齡
- $min
- $max
-$push
可以把某個欄位放到列表中,$$ROOT
表示整條資料 - …
管道
group管道
把資料進行分組,分別對組進行表示式操作
db.stu.aggregate([
{
$group : {
// 第一參按照哪個欄位進行分組 key使用 _id,value編寫欄位名稱必須新增 $
// 如果想讓所有資料就為一組可以設定成 null
_id:null,//"$gender",
// 統計表達式
// "來自的地區人數":{$sum:1}
"平均年齡":{$avg:"$age"}
// "獲取最小年齡":{$min:"$age"}
// "來自地區":{$push:"$hometown"}
// "資料":{$push:"$$ROOT"}
}
}
]).pretty()
match管道
db.stu.aggregate([
{
// match 表示式和 查詢條件寫法一模一樣
$match: {
age:{$gt:18}
}
},
{
$group: {
_id:"$hometown",
"平均年齡":{$avg:"$age"}
}
}
])
project 管道
就和查詢時投影作用一樣,如果需要顯示欄位就設定 1,
db.stu.aggregate([
{
// match 表示式和 查詢條件寫法一模一樣
$match: {
age:{$gt:18}
}
},
{
$project: {
// 顯示
age:1,
name:1,
hometown:1,
_id:0
}
}
])
sort 管道
db.stu.aggregate([
{
// match 表示式和 查詢條件寫法一模一樣
$match: {
age:{$gt:18}
}
},
{
$group: {
_id:"$hometown",
"平均年齡":{$avg:"$age"}
}
},
{
$sort:{
"平均年齡":1
}
}
])
limit 管道 和 skip管道
同時使用,有先後順序操作,誰先就誰操作
db.stu.aggregate([
{
// match 表示式和 查詢條件寫法一模一樣
$match: {
age:{$gt:18}
}
},{
$limit:1
}
])
db.stu.aggregate([
{
// match 表示式和 查詢條件寫法一模一樣
$match: {
age:{$gt:18}
}
},{
$skip:1
}
])
db.stu.aggregate([
{
// match 表示式和 查詢條件寫法一模一樣
$match: {
age:{$gt:18}
}
},{
$limit:2
},{
$skip:1
}
])
unwind 管道
通過某個欄位資料拆分,預設情況下如果欄位為 空,null,沒有欄位就會被過濾,如果不想過濾欄位就得配置資訊
db.t3.aggregate([
// 欄位名稱
{$unwind:'$size'}
])
// 配置不過濾資料
db.t3.aggregate([
{
$unwind:{
// 指定拆分欄位
path:'$size',
// 如果欄位為空null和空就保留下來
preserveNullAndEmptyArrays:true
}
}
])
索引
- 檢視索引
db.t1.getIndexes()
- 建立索引
db.t1.ensureIndex(
// 建立索引欄位名稱
{"name":1},
// 是否唯一,預設為 false
{"unique":true}
)
- 刪除索引
// 通過獲取索引列表檢視 name 名稱
db.t1.dropIndex("索引名稱")
備份恢復
// 作用匯出資料庫並且進行壓縮
mysqldump -u使用者 -p密碼 資料庫名稱 | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
// 第二步 crontab 定製執行這個指令碼
使用者驗證
啟動使用者驗證
// 啟動方式一
sudo mongod --auth
// 在配置檔案中加入 auth=True
建立root賬號
當驗證模式啟動後,如果資料庫中沒有 root 賬號,那麼必須先建立 root 賬號
// 進入管理員資料庫
use admin
// 建立 root賬號
db.createUser(
{
"user":"python",
"pwd":"123456",
"roles":["root"]
}
)
// 一旦建立 root 賬號程式就不允許繼續建立
登入
// 進入管理員資料庫
use admin
// 登入
db.auth('使用者名稱','密碼')
建立普通賬號
// 進入管理員資料庫
use admin
// 建立 普通賬號
db.createUser(
{
"user":"db01",
"pwd":"123456",
"roles":[
{
// 指定訪問資料庫名稱
"db":"mydb_01",
// 指定許可權 read,write,readWrite
"role":"readWrite"
}
]
}
)
db.createUser(
{
"user":"db02",
"pwd":"123456",
"roles":[
{
// 指定訪問資料庫名稱
"db":"mydb_02",
// 指定許可權 read,write,readWrite
"role":"readWrite"
}
]
}
)
顯示當前使用者列表
show users
刪除使用者
// 不推薦使用
db.removeUser('使用者名稱')
// 推薦使用
db.dropUser('使用者名稱')