1. 程式人生 > >資料庫mongodb基本操作總結筆記

資料庫mongodb基本操作總結筆記

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

【注意事項】:

  1. 資料庫檔案找到引發的錯誤 Data directory /data/db not found., terminating
sudo mkdir /data
 sudo mkdir /data/db
  1. 許可權不夠新增sudo
  2. 可能虛擬機器的硬碟大小太小了,小到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('使用者名稱')

以上內容僅是代表個人總結 若有錯誤之處,還請批評指正,歡迎大家一起學習!