MongoDB進階操作
阿新 • • 發佈:2018-12-23
limit 和 skip
limit 限制顯示條數
db.stu.find().limit(2)
skip 跳過記錄數
db.stu.find().skip(1)
【重點】如果limit和skip同時使用,先skip後limit不管先後順序
db.stu.find().limit(2).skip(1)
db.stu.find().skip(1).limit(2)
投影
設定顯示欄位
設定顯示方式(投影),設定為 1 表示欄位顯示,沒有設定表示不顯示,_id 預設顯示,如果想讓他不顯示可以設定成 0
db.stu.find( // 查詢條件 {}, // 設定顯示方式(投影) { _id:0, name:1 } )
排序
排序條件:1升序,-1降序
db.stu.find().sort(
// 排序條件
{
age:-1,
gender:1
}
)
統計個數
// 方式一
db.stu.find({}).count()
// 方式二
db.stu.count()
消除重複
db.stu.distinct(
// 去重欄位
'hometown',
// 查詢條件
{
age:{$gt:15}
}
)
聚合操作
find 用於查詢資料,聚合(aggregate)主要用於計算資料和統計資料
語法
db.集合名稱.aggregate([ {管道型別 : {表示式}}, {管道型別 : {表示式}}, {管道型別 : {表示式}}, ... ])
管道型別
- List item
$group作用 按照某個欄位進行分組,針對每組進行表示式計算
db.stu.aggregate([ { $group : { // 第一個引數必須是 _id,傳遞的是欄位名稱之前必須新增$,如果想要所有資料作為一組可以把引數設定成 null _id:"null",//"$gender", // 表示式計算 // "按照家鄉記錄總個數":{$sum:1}, // 計算平均值 // "平均年齡":{$avg:"$age"}, // 計算最大值 "最大年齡":{$max:"$age"}, // 計算最小值 "最小年齡":{$min:"$age"} // 把某個欄位放入的統計列表中 // "統計欄位資料":{$push:"$$ROOT"} } } ])
$match 匹配出符合條件的資料,
db.stu.aggregate([
// 匹配出大於20歲的記錄
{
$match : {
// 和 find 引數一樣
// 匹配條件
age:{$gt:20}
}
},
// 進匹配出的記錄進行分組,獲取所有的分組名稱
{
$group: {
_id:"$hometown",
"名稱":{$push:"$name"}
}
}
])
$project跟投影一樣
db.stu.aggregate([
// 匹配出大於20歲的記錄
{
$match : {
// 和 find 引數一樣
// 匹配條件
age:{$gt:20}
}
},
// 利用投影顯示記錄
{
$project: {
// 引數和 投影引數一樣
name:1,
_id:0
}
}
])
$ sort對資料進行排序
db.stu.aggregate([
// 匹配出大於20歲的記錄
{
$match : {
// 和 find 引數一樣
// 匹配條件
age:{$gt:20}
}
},
{
$sort:{
// 引數和查詢排序引數一樣
age:-1
}
}
])
$ limit 和 $skip
【注意】在管道中 $limit 和 $skip 有先後順序
db.stu.aggregate([
// 匹配出大於20歲的記錄
{
$match : {
// 和 find 引數一樣
// 匹配條件
age:{$gt:16}
}
},
{
$skip:1
},
{
$limit:2
}
])
$unwind 作用是按照欄位列表進行拆分資料,預設情況下管道會自動過濾 陣列為空,null,不存在的欄位資料,如果想不過濾設定 preserveNullAndEmptyArrays 為 true
db.t3.aggregate([
{
$unwind:"$size"
}
])
// 不過濾資料
db.t3.aggregate([
{
$unwind:{
// 設定拆分欄位
"path":'$size',
// 不過濾資料
preserveNullAndEmptyArrays:true
}
}
])
用於管道計算的表示式
- $sum對資料進行累加操作
- $avg平均值
- $min最小值
- $max最大值
- $ push把某個欄位放入的統計列表中,關鍵詞$$ROOT表示整條資料
- $first第一條
- $last最後一條
索引
建立索引
db.t1.ensureIndex(
// name 索引欄位 值 1 升序,-1 降序
{name:1},
// 設定唯一索引,預設不是唯一索引
// unique 是去重的方式之一
{"unique":true}
)
查詢索引
db.t1.getIndexes()
刪除索引
// 最好使用查詢索引獲取
db.t1.dropIndex('索引名稱')
備份與恢復
備份
mongodump -h dbhost -d dbname -o dbdirectory
恢復
mongorestore -h dbhost -d dbname --dir dbdirectory
擴充套件備份寫法(小伺服器備份)
1.寫一個 sh 指令碼檔案
mysqldump -uroot -p123456 資料庫名 | gzip > /backups/bk_$(date +%Y%m%d_%H%M%S).sql.gz
mongodump -h dbhost -d dbname -o dbdirectory
2.利用 crontab 定時執行
驗證模式
mongodb 預設情況下是沒有任何限制的
開啟驗證模式
- 在執行時攜帶 --auth
- 在配置檔案中配置 auth=true
實現驗證模式
1.如果沒有root賬號必須先建立一個root賬號,一旦建立成功賬戶系統立刻啟動
// 進入管理員資料庫
use admin
// 建立root賬號
db.createUser(
{
"user":"python",
"pwd":"123456",
// 設定角色為 root
"roles":["root"]
}
)
2.管理員登入
use admin
// 如果返回1 表示登入成功
db.auth('使用者名稱','密碼')
3.建立其他有許可權的賬號
// 必須管理員登入
use admin
db.createUser(
{
"user":"db01",
"pwd":"123456",
// 設定許可權賬號
"roles":[
{
// 設定允許訪問資料庫名稱
"db":"db_01",
// 訪問資料庫許可權 read,write,readWrite
"role":"readWrite"
}
]
}
)
db.createUser(
{
"user":"db02",
"pwd":"123456",
// 設定許可權賬號
"roles":[
{
// 設定允許訪問資料庫名稱
"db":"db_02",
// 訪問資料庫許可權 read,write,readWrite
"role":"readWrite"
}
]
}
)
4.檢視使用者列表
// 必須管理員登入
use admin
show users
5.普通使用者登入
use admin
db.auth('使用者名稱','密碼')
6.刪除使用者
// 必須管理員登入
use admin
// 已被廢棄
db.removeUser('使用者名稱')
// 推薦使用
db.dropUser('使用者名稱')