天天看點

MongoDB資料庫增删改查MongoDB 的學習筆記

MongoDB 的學習筆記

MongoDB 安裝

Ubuntu 安裝

sudo apt-get install mongodb
           

Mac 安裝

brew install mongodb
           

MongoDB 啟動

Ubuntu 啟動方式

1. 啟動服務方式(守護程序方式啟動) (部署ubuntu伺服器的時候基本使用這種方案)
會有

看門口狗

的方式,當

mongodb

閃退的時候,作業系統自動會重新啟動
# 啟動
sudo service mongodb start
# 停止
sudo service mongodb stop
           
2. 直接手動啟動 (挂住終端的形式啟動)
# 啟動
sudo mongod
# 停止
輸入 ctrl + C
           

注意事項:如果啟動不成功

1. 請注意對預設路徑

/data/db

是否有通路權限,解決方法使用

sudo

方式啟動
  1. 資料庫的路徑是否存在

    /data/db

    ,如果不存在就建立
Mac 啟動
sudo mongod
           
mongod 啟動參數說明

--dbpath

設定資料的路徑(如果不傳遞就是

/data/db

-f [--config] 配置檔案路徑

啟動時使用配置檔案進行啟動

--fork

守護程序啟動(必須攜帶 –logpath)

--auth

開啟認證權限

指令行用戶端連結

預設連結的IP位址: 127.0.0.1

預設端口: 27017

mongo
           
認證權限模式
如果沒有啟動

認證權限模式

對所有的資料全部有通路權限

開啟權限

當沒有任何使用者時,預設情況下,第一步先是建立

root

使用者

一旦建立好第一個root賬号以後所有的通路權限都無效,需要使用root賬号進行登入

// 進入管理者資料庫
use admin
// 建立root賬号
db.createUser({
    user: 'python',
    pwd:'123456',
    roles:["root"]
})

db.createUser({
    user: 'user_01',
    pwd:'123456',
    roles:[
        {
            db: 'db_01',
            role: 'readWrite' // 讀寫都支援,read 隻讀,write 隻寫
        }
    ]
})

db.createUser({
    user: 'user_02',
    pwd:'123456',
    roles:[
        {
            db: 'db_02',
            role: 'readWrite' // 讀寫都支援,read 隻讀,write 隻寫
        }
    ]
})
           
登入賬号
// 進入管理者資料庫
use admin
// 登入,如果傳回 1 表示登入成功
db.auth('使用者名','密碼')
           
删除使用者
use admin
// 可以删除使用者但是希望使用另一種方式删除
db.removeUser('user_01')
// 或
db.dropUser('user_02')
           

資料庫操作流程

mongodb 資料庫有哪些組成

    1. 資料庫(database) -> 資料庫
    1. 集合(collections) -> 表
    1. 文檔 -> 行
    1. field -> 字段
    1. index
    1. _id -> 主鍵

database 操作

擷取資料庫清單
show databases;
           
進入資料庫
use 資料庫名字
           
檢視目前進入的資料庫位置
db
           
建立database
// 進入某個資料庫中,如果該資料庫被添加資料自動建立
use 資料庫
           
删除database
// 進入資料庫
use 資料庫
// 删除資料庫
db.dropDatabase()
           

集合(表)操作

前提條件
use 資料庫
           
檢視所有的集合
建立集合
建立第一種方案
db.createCollection('集合名稱')
           

第二種方案

如果直接添加資料會自動建立集合

删除集合
db.集合名稱.drop()
           

資料操作

前提條件
use 資料庫
           
增加(insert)
// 單條查詢
db.stu.insert(
    {
        name:"小明",
        age: 
    }
)
// 定義變量插入
data = {
    name:"小紅",
    age:
}
db.stu.insert(data)

// 批量插入
data = [
    {
        name:"小王",
        age:
    },
    {
        name:"小李",
        age:
    }
]
db.stu.insertMany(data)
           
更新 (update)

格式 db.stu.update(“更新條件”,”更新内容”,”更新方式”)

預設更新整體更新

db.stu.update(
        {
            name:"小王"
        },
        {
            age:
        }
    )
           
局部更新方式

$set

db.stu.update(
        {
            name:"小明"
        },
        {
            $set: {
                age:
            }
        }
    )
           
批量更新,預設情況下隻更新一條
db.stu.update(
        {
            name:"小李"
        },
        {
            $set: {
                age: 
            }
        },
        {
            multi:true  //預設不填寫就是 false
        }
    )
           
删除 (delete)
// 預設情況下是全部符合條件的删除
db.stu.remove(
    {
        name:"小明"
    }
)
// 僅僅隻删除一條
db.stu.remove(
    {
        name:"小李"
    },
    {
        justOne:true // 預設删除是false
    }
)

// 清空資料
db.stu.remove({})
           

資料:

db.stu.insert({_id : 1, name:’郭靖’,hometown:’蒙古’,age:20,gender:true})

db.stu.insert({_id : 2, name:’黃蓉’,hometown:’桃花島’,age:18,gender:false})

db.stu.insert({_id : 3, name:’華筝’,hometown:’蒙古’,age:18,gender:false})

db.stu.insert({_id : 4, name:’黃藥師’,hometown:’桃花島’,age:40,gender:true})

db.stu.insert({_id : 5, name:’段譽’,hometown:’大理’,age:16,gender:true})

db.stu.insert({_id : 6, name:’段王爺’,hometown:’大理’,age:45,gender:true})

資料儲存
根據

_id

進行判定,如果

_id

存在我就更新,如果

_id

不存在就插入
查詢
  1. 查詢所有資料
db.stu.find()
           
  1. 查詢一條資料
db.stu.findOne()
           
  1. 查詢帶條件
db.stu.find(
    {
        gender:false,
        hometown:"蒙古"
    }
)
           
  1. 比較運算符查詢(

    $gt

    ,

    $gte

    ,

    $lt

    ,

    $lte

    ,

    $ne

    )
db.stu.find(
    {
        age:{$ne:}
    }
)
           
  1. 邏輯運算符($or)
db.stu.find(
    {
        $or:[
            {age:,gender:true},
            {hometown:'蒙古'}
        ]
    }
)



           
  1. 範圍運算符( in, i n , nin)
// $in 兩個資料要麼 18 要麼 45
db.stu.find(
    {
        hometown:{$in:["蒙古","桃花島"]}
    }
)
           
  1. 正規表達式
// 寫法一
db.stu.find(
    {
        hometown:/^蒙/
    }
)
// 寫法二
db.stu.find(
    {
        hometown:{$regex:"^蒙"}
    }
)
           
  1. 自定義查詢
db.stu.find(
    {
        $where: function() {
            return this.age >  && this.age < 
        }
    }
)
           
  1. limit 和 skip
//  limit 使用
db.stu.find().limit()

// skip 使用 
db.stu.find().skip()

// 同時使用 不管代碼 在前還是在後都是 先 skip 後 limit
db.stu.find().limit().skip()
db.stu.find().skip().limit()
           
  1. 投影,是否顯示字段 (1:表示顯示,0:表示不顯示)
db.stu.find(
    {
        age:
    },
    {
        _id:
    }
)
           
  1. 排序 (1 表示升序,-1 表示降序)
db.stu.find().sort(
    {
        age:,
        hometown:
    }
)
           
  1. 統計個數
// 第一種寫法
db.stu.find({age:}).count()
// 第二種寫法
db.stu.count(
    {
        age:
    }
)
           
  1. 消除重複
db.stu.distinct('hometown',{age:{$gt:}})
           

聚合查詢

格式
db.集合名稱.aggregate([ 
    {管道 : {表達式}},
    {管道 : {表達式}},
    {管道 : {表達式}},
     ...
])
           
$group 管道對某些資料進行分組操作

$group

定義要分組的字段必須

_id

上,内容字段必須加上

$

// 按照性别分組,計算總數
db.stu.aggregate([
    {$group:{
            // _id 必須填寫
            _id:'$gender',
            // $sum 對分組後的資料集合進行數量統計
            counter:{$sum:}
        }
    }
])

// 按照性别分組,計算最大年齡
db.stu.aggregate([
    {$group:{
            // _id 必須填寫
            _id:'$gender',
            max:{$max:'$age'}
        }
    }
])

// 按照性别分組,計算最小年齡
db.stu.aggregate([
    {$group:{
            // _id 必須填寫
            _id:'$gender',
            min:{$min:'$age'}
        }
    }
])

// 按照性别進行分組,計算來自的地區
// $push 把具體資料放入清單
// $$ROOT 表示整條資料
db.stu.aggregate([
    {$group:{
            // _id 必須填寫
            _id:'$gender',
            from:{$push:'$$ROOT'}
        }
    }
]).pretty()



// 按照性别進行分組,對分組内容計算平均值
db.stu.aggregate([
    {$group:{
            // _id 必須填寫
            _id:'$gender',
            avgAge:{$avg:'$age'}
        }
    }
])
           

$match

管道 過濾資料
// match 基本操作
db.stu.aggregate([
    {
        $match:{
            age:{$gt:}
        }
    } 
// 管道 結果 可以提供給下一個管道作為資料源

// 需求:去除所有小于20歲,對性别進行分組,擷取來的家鄉
db.stu.aggregate([
    {
        $match:{
            age:{$lt:}
        }
    },
    {
        $group:{
            _id:"$gender",
            from:{$push:"$hometown"}
        }
    }
])
           

$project

對字段是否顯示
// 需求:去除所有小于20歲,對性别進行分組,擷取來的家鄉
db.stu.aggregate([
    {
        $match:{
            age:{$lt:}
        }
    },
    {
        $group:{
            _id:"$gender",
            from:{$push:"$hometown"}
        }
    },
    {
        $project:{
            _id:
        }
    }
])
           

$sort

管道,排序,1:升序 -1:降序
db.stu.aggregate([
    {
        $match:{
            age:{$lt:}
        }
    },
    {
        $sort:{
            age:
        }
    }
])
           

$limit

$skip

管道,2個同時使用需要注意順序
db.stu.aggregate([
    {
        $match:{
            age:{$lt:}
        }
    },
    {
        $sort:{
            age:
        }
    },
    {
        $skip:
    },
    {
        $limit:
    }
])
           

$unwind

管道,拆分清單資料變成多條資料,預設情況下如果資料為空或者是空清單就過濾

資料構造:

db.t3.insert([

{ “_id” : 1, “item” : “a”, “size”: [ “S”, “M”, “L”] },

{ “_id” : 2, “item” : “b”, “size” : [ ] },

{ “_id” : 3, “item” : “c”, “size”: “M” },

{ “_id” : 4, “item” : “d” },

{ “_id” : 5, “item” : “e”, “size” : null }

])

db.t3.aggregate([
    {
        $unwind:'$size'
    }
])
// 不丢失資料
db.t3.aggregate([
    {
        $unwind: {
            path:"$size",
            preserveNullAndEmptyArrays:true // 不過濾資料,保留白清單和為空的資料
        }
    }
])
           

索引

建立索引
db.集合.ensureIndex({屬性:})
           
列出索引
db.t1.getIndexes()
           
删除索引
db.t1.dropIndex('索引名稱')