1. 程式人生 > >MongoDB進階操作

MongoDB進階操作

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 預設情況下是沒有任何限制的

開啟驗證模式

  1. 在執行時攜帶 --auth
  2. 在配置檔案中配置 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('使用者名稱')