MongoDB手冊

calong發表於2021-03-18

1. 使用者管理

角色 描述 資料庫
read 資料庫讀取許可權 *
readWrite 資料庫讀寫許可權 *
dbAdmin 執行管理函式許可權 *
userAdmin 執行使用者管理許可權 *
clusterAdmin 所有分片和複製集相關函式的管理許可權 admin
readAnyDatabase 所有資料庫的讀取許可權 admin
readWriteAnyDatabase 所有資料庫的讀寫許可權 admin
userAdminAnyDatabase 所有資料庫的userAdmin許可權 admin
dbAdminAnyDatabase 所有資料庫的dbAdmin許可權 admin
root 超級許可權 admin
# 建立使用者
db.createUser({user: "root", pwd: "root", roles:[{role:"root", db:"admin"}]})
# 查詢使用者
db.system.users.find()

開啟資料庫安全認證

security:
  authorization: enabled
# 認證使用者
db.auth("root", "root")
# 更新使用者
db.updateUser("root", {pwd: "123456"})
# 更改使用者密碼
db.changeUserPassword("root", "123456")
# 刪除使用者
db.dropUser("root")

2. 資料庫管理

# 建立/切換資料庫
use test
# 查詢所有資料庫
show databases
# 刪除資料庫(需要先切換到要刪除的資料庫)
db.dropDatabase()

3. 集合管理

# 建立集合
db.createCollection("col1")
# 檢視集合
show collections/tables
# 刪除集合
db.col1.drop()

4. 文件管理

# 建立文件
db.col1.insertMany([
    {"name": "test", "value": "test"},
    {"name": "test", "value": "test"
])
# 新增單個文件
db.col1.insertOne({"name": "test", "value": "test"})

save()insert()都可用於建立文件, save()還可用於更新文件

集合col1文件內容

{ "_id" : ObjectId("603eef2fd702dd13f81d99de"), "name" : "calong", "age" : 19, "sex" : "M" }
{ "_id" : ObjectId("603eef3ed702dd13f81d99df"), "name" : "sarach", "age" : 18, "sex" : "W" }
{ "_id" : ObjectId("60404c486c5e206a4273fc9c"), "name" : "keras", "age" : 21, "sex" : "M" }
{ "_id" : ObjectId("60404c576c5e206a4273fc9d"), "name" : "Jiawen", "age" : 22, "sex" : "M" }
條件操作符 含義 語法
$gt/$gte 大於/大於等於 {鍵:{$gt/$gte:值}}
$lt/$lte 小於/小於等於 {鍵:{$lt/$lte:值}}
$eq/$ne 等於/不等於 {鍵:{$eq/$ne:值}}
$and 且連線 {鍵:{$and:[{條件}, {條件}]}}
$or 或連線 {鍵:{$or:[{條件}, {條件}]}}
$in/$nin 包含 {鍵:{$in/$nin:[值, 值]}}
$type 型別判斷符 {鍵:{$type:值}}
# 查詢所有文件
db.col1.find()
# 按條件查詢
db.col1.find({name: "calong"})
# 查詢指定屬性
db.col1.find({}, {_id: 0, name:1, age:1})
# 查詢符合條件的指定屬性
db.col1.find({name: "calong"}, {_id:0, name:1, age:1})
# 正則查詢
db.col1.find({name: /^Jia/})
# 條件操作符
db.col1.find({age:{$gt:20}})

# 覆蓋文件
db.col1.update({name: "calong"}, {name: "calong", age: 21, sex: "M"})
# 更新指定屬性(沒有則建立)
db.col1.update({name: "calong"}, {$set:{grade: 97}})
# $inc操作符
db.col1.update({name: "calong"}, {$inc:{grade: 1}})
# 刪除文件指定屬性
db.col1.update({name: "calong"}, {$unset:{grade: 1}})

# 陣列操作
# 向陣列中新增值(沒有則建立)
db.col1.update({name: "calong"}, {$push:{class:"Java"}})
# 從陣列尾部(1)或頭部(-1)刪除一個值
db.col1.update({name: "calong"}, {$pop:{class:1}})
# 從陣列中刪除指定的單個值
db.col1.update({name: "calong"}, {$pull:{class:"Java"}})
# 從陣列中刪除指定的多個值
db.col1.update({name: "calong"}, {$pullAll:{class:["Java"]}})

# 重新命名屬性
db.col1.update({name: "calong"}, {$rename:{class:"subject"}})

# 從符合條件的文件中刪除一個
db.col1.deleteOne({name: "Jiawen"})
# 刪除所有符合條件的文件
db.col1.deleteMany({name: "Jiawen"})

remove()也可以用於刪除文件

# 分頁查詢(skip表示跳過幾個, limit表示查詢幾個)
db.col1.find().limit(2).skip(1)
# 排序查詢(1表示升序, -1表示降序)
db.col1.find().sort({name:1})

5. 聚合函式

# group表示分組(_id的值表示分組欄位)
# 求總條數
db.col1.aggregate([{$group: {_id: null, count: {$sum: 1}}}])
# 求和
db.col1.aggregate([{$group: {_id: null, sum: {$sum: "$age"}}}])
# 篩選(match在group之前表示分組前篩選, 在group之後表示分組時候篩選)
db.col1.aggregate([{$match: {name: /a/}}, {$group: {_id: null, sum: {$sum: "$age"}}}])
db.col1.aggregate([{$group: {_id: null, sum: {$sum: "$age"}}}, {$match: {name: /a/}}])
# 最大值
db.col1.aggregate([{$group: {_id: null, max: {$max: "$age"}}}])
# 最小值
db.col1.aggregate([{$group: {_id: null, min: {$min: "$age"}}}])
# 平均值
db.col1.aggregate([{$group: {_id: null, avg: {$avg: "$age"}}}])
# 分組並返回分組統計的資料
db.col1.aggregate([{$group: {_id: "$age", count: {$sum: 1}, names: {$push: "$name"}}}])

當前資料

{ "_id" : ObjectId("603eef2fd702dd13f81d99de"), "name" : "calong", "age" : 21, "sex" : "M", "subject" : [ "Python", "Golang" ] }
{ "_id" : ObjectId("603eef3ed702dd13f81d99df"), "name" : "sarach", "age" : 18, "sex" : "W", "subject" : [ "Golang", "C++" ] }
{ "_id" : ObjectId("60404c486c5e206a4273fc9c"), "name" : "keras", "age" : 21, "sex" : "M", "subject" : [ "JavaScript", "Rust" ] }
# 陣列欄位拆分
db.col1.aggregate({$unwind: "$subject"})

6. 索引管理

引數 含義
background 後臺執行建立過程 true/false
unique 是否為唯一索引(唯一索引的欄位不能包含重複的值) true/false
name 索引名稱 “index_name”
sparse 只對文件中存在的欄位啟用索引(稀疏索引) true/false
expireAfterSeconds 集合的生存時間TTL 100
partialFilterExpression 部分索引 {partialFilterExpression:{條件:{欄位:值}}}
# 建立索引(1表示升序, -1表示降序)
db.col1.createIndex({name: 1}, {background: true})
# 檢視索引
db.col1.getIndexes()
# 檢視建立索引的鍵
db.col1.getIndexKeys()
# 檢視索引大小(不加參數列示顯示總大小)
db.col1.totalIndexSize([1])
# 刪除指定索引
db.col1.dropIndex("name_1")
# 刪除所有索引(除主鍵之外)
db.col1.dropIndexes()
# 重建索引
db.col1.reIndex()

索引型別包括:

  1. 單欄位索引
  2. 交叉索引: 為一個集合的多個欄位分別建立索引(多個單欄位索引)
  3. 複合索引: 對多個欄位聯合建立索引
  4. 多KEY索引: 陣列型別的索引
# 查詢執行計劃
db.col1.find().explain()
本作品採用《CC 協議》,轉載必須註明作者和本文連結