朝陽區(qū)社會建設(shè)工作室網(wǎng)站高效統(tǒng)籌疫情防控和經(jīng)濟(jì)社會發(fā)展
文章目錄
- 一、數(shù)據(jù)庫操作
- 二、集合操作
- 三、文檔操作
- 3.1 插入文檔
- 3.2 查詢文檔
- 3.3 更新文檔
- 3.4 刪除文檔
- 四、安全認(rèn)證
- 4.1 創(chuàng)建管理員賬號
- 4.2 創(chuàng)建應(yīng)用數(shù)據(jù)庫用戶
- 4.3 啟動和連接 (校驗方式)
提示:以下是本篇文章正文內(nèi)容,MongoDB 系列學(xué)習(xí)將會持續(xù)更新
一、數(shù)據(jù)庫操作
①查看數(shù)據(jù)庫
show dbs
show databases
②查看當(dāng)前正在使用的數(shù)據(jù)庫 (默認(rèn)的數(shù)據(jù)庫為 test,如果你沒有選擇數(shù)據(jù)庫,集合將存放在 test 數(shù)據(jù)庫中)
db
③選擇或創(chuàng)建數(shù)據(jù)庫 (新建的數(shù)據(jù)庫會暫時存放到內(nèi)存中,所以無法用show查看,只有插入內(nèi)容會才會持久化到磁盤中)
use 數(shù)據(jù)庫名稱
④刪除數(shù)據(jù)庫
db.dropDatabase()
⑤默認(rèn)存在的數(shù)據(jù)庫
- admin:從權(quán)限的角度來看,這是 “root” 數(shù)據(jù)庫。要是將一個用戶添加到這個數(shù)據(jù)庫,這個用戶自動繼承所有數(shù)據(jù)庫的權(quán)限。一些特定的服務(wù)器端命令也只能從這個數(shù)據(jù)庫運(yùn)行,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器。
- local:這里的數(shù)據(jù)永遠(yuǎn)不會被復(fù)制,可以用來存儲限于本地單臺服務(wù)器的任意集合。
- config:當(dāng) Mongo 用于分片設(shè)置時,config 數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的相關(guān)信息。
二、集合操作
①查看集合
show collections
show tables
②顯式創(chuàng)建集合
db.createCollection(集合名)
db.createCollection("books")
# 設(shè)置參數(shù)
db.createCollection(name, options)
固定集合 options 參數(shù):
字段 | 類型 | 描述 |
---|---|---|
capped | 布爾 | (可選)如果為 true,則創(chuàng)建固定集合。固定集合是指有著固定大小的集合,當(dāng)達(dá)到最大值時,它會自動覆蓋最早的文檔。 |
size | 數(shù)值 | (可選)為固定集合指定一個最大值(以字節(jié)計)。如果 capped 為 true,也需要指定該字段。 |
max | 數(shù)值 | (可選)指定固定集合中包含文檔的最大數(shù)量。 |
③刪除集合:結(jié)果會返回 true 或 false
db.collection.drop()
db.books.drop()
④查看集合詳情
db.collection.stats()
回到目錄…
三、文檔操作
文檔(document)的數(shù)據(jù)結(jié)構(gòu)和 JSON 基本一樣,所有存儲在集合中的數(shù)據(jù)都是 BSON 格式。
3.1 插入文檔
insert
:若插入的數(shù)據(jù)主鍵已經(jīng)存在,則會拋 DuplicateKeyException 異常,提示主鍵重復(fù),不保存當(dāng)前數(shù)據(jù)。支持單行和多行插入save
:如果 _id 主鍵存在則更新數(shù)據(jù),如果不存在就插入數(shù)據(jù)。支持單行和多行插入db.collection.insertOne()
:版本3.2新增,支持 writeConcern。僅支持單行插入db.collection.insertMany()
:版本3.2新增,支持 writeConcern。支持多行插入
writeConcern 決定一個寫操作落到多少個節(jié)點(diǎn)上才算成功。它的取值包括:
0
:發(fā)起寫操作,不關(guān)心是否成功。1
:默認(rèn)的寫入策略。集群最大數(shù)據(jù)節(jié)點(diǎn)數(shù),寫操作需要被復(fù)制到指定節(jié)點(diǎn)數(shù)才算成功。majority
:寫操作需要被復(fù)制到大多數(shù)節(jié)點(diǎn)上才算成功。
①新增單個文檔
db.collection.insertOne(<document>,{writeConcern: <document>}
)
db.user.insertOne({name:"zhangsan",password:"123",age:18})
②批量新增文檔: ordered 指定是否按順序?qū)懭?#xff0c;默認(rèn) true,按順序?qū)懭搿?/font>
db.collection.insertMany([ <document 1> , <document 2>, ... ],{writeConcern: <document>,ordered: <boolean>}
)
db.user.insertMany([{name:"lisi",password:"456",age:19},{name:"wangwu",password:"789",age:20},{name:"zhaoliu",password:"258",age:21}])
③執(zhí)行腳本插入
編輯腳本 book.js
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<50;i++){var typeIdx = Math.floor(Math.random()*types.length);var tagIdx = Math.floor(Math.random()*tags.length);var favCount = Math.floor(Math.random()*100);var book = {title: "book-"+i,type: types[typeIdx],tag: tags[tagIdx],favCount: favCount,author: "xxx"+i};books.push(book)
}
db.book.insertMany(books);
進(jìn)入 MongoShell 中執(zhí)行:pwd() 查看當(dāng)前路徑
load("../js/books.js")
回到目錄…
3.2 查詢文檔
db.collection.find(query, projection)
db.collection.findOne(query, projection)
- query:可選,使用查詢操作符指定查詢條件。
- projection:可選,使用投影操作符指定返回的鍵。投影時,id為1的時候,其他字段必須是1;id是0的時候,其他字段可以是0;如果沒有_id字段約束,多個其他字段必須同為0或同為1。
①指定文檔查詢
# 全列查詢
db.book.find()// 指定列查詢,(0表示不查、1表示查詢), 默認(rèn)_id:1
db.book.find({},{title:1,author:1})
// 僅查詢 title 和 author 字段
db.book.find({},{_id:0,title:1,author:1})
②條件查詢
// 查詢標(biāo)題為“book-2”的文檔
db.book.find({title:"book-2"})// 查詢分類為“travel” 且 收藏數(shù)超過60個的book文檔
db.book.find({type:"travel",favCount:{$gt:60}})// 查詢type為“travel” 或 tag為"nosql"的book文檔
db.book.find({$or:[{type:"travel"},{tag:"nosql"}]})
示例:
邏輯運(yùn)算符對照表:
邏輯運(yùn)算符 | SQL | MQL |
---|---|---|
a = 1 | {a: 1} | |
$lt | a < 1 | {a: {$lt: 1}} |
$lte | a <= 1 | {a: {$lte: 1}} |
$gt | a > 1 | {a: {$gt: 1}} |
$gte | a >= 1 | {a: {$gte: 1}} |
$ne | a != 1 | {a: {$ne: 1}} |
$and | a = 1 and b = 1 | {a: 1, b: 1} 或 {$and: [{a: 1}, {b: 1}]} |
$in | a in (1, 2, 3) | {a: {$in: [1, 2, 3]}} |
$nin | a not in (1, 2, 3) | {a: {$nin: [1, 2, 3]}} |
$or | a = 1 or b = 1 | {$or: [{a: 1}, {b: 1}]} |
$regex | c 包含字符串 “abc” | {c: {$regex: “abc”}} |
③排序 & 分頁
指定排序:使用 sort() 方法對數(shù)據(jù)進(jìn)行排序。
// 指定按收藏數(shù)(favCount)降序返回
db.book.find().sort({favCount:-1})
分頁查詢:skip 用于指定跳過記錄數(shù),limit 則用于返回結(jié)果數(shù)量。
// 分頁設(shè)計: 每頁大小為8條的book文檔
// 第一頁
db.book.find().skip(0).limit(8)
// 第二頁
db.book.find().skip(8).limit(8)
// 第三頁
db.book.find().skip(16).limit(8)
④正則表達(dá)式匹配查詢
// 查找type包含“so”字符串的book文檔
db.book.find({type:{$regex:"so"}})
// 使用正則表達(dá)式
db.book.find({type:/so/})
回到目錄…
3.3 更新文檔
db.collection.update(query,update,options)
- query:描述更新的查詢條件。
- update:描述更新的動作及新的內(nèi)容。
- options:描述更新的選項。
upsert
: 可選,如果不存在 update 的記錄,是否插入新的記錄。默認(rèn) false,不插入。multi
: 可選,是否按條件查詢出的多條記錄全部更新。 默認(rèn) false,只更新找到的第一條記錄。writeConcern
:可選,決定一個寫操作落到多少個節(jié)點(diǎn)上才算成功。
操作符 | 格式 | 描述 |
---|---|---|
$set | {$set:{field:value}} | 指定一個鍵并更新值,若鍵不存在則創(chuàng)建 |
$unset | {$unset : {field : 1 }} | 刪除一個鍵 |
$inc | {$inc : {field : value } } | 對數(shù)值類型進(jìn)行增減 |
$rename | {$rename : {old_field_name : new_field_name } } | 修改字段名稱 |
$push | { $push : {field : value } } | 將數(shù)值追加到數(shù)組中,若數(shù)組不存在則會進(jìn)行初始化 |
$pushAll | {$pushAll : {field : value_array }} | 追加多個值到一個數(shù)組字段內(nèi) |
$pull | {$pull : {field : _value } } | 從數(shù)組中刪除指定的元素 |
$addToSet | {$addToSet : {field : value } } | 添加元素到數(shù)組中,具有排重功能 |
$pop | {$pop : {field : 1 }} | 刪除數(shù)組的第一個或最后一個元素 |
①更新單個文檔
// 將book-0書籍的數(shù)量增加一本
db.book.update({title:"book-0"},{$inc:{favCount:1}})
②更新多個文檔
// 將分類為“novel”的文檔的增加發(fā)布時間(publishedDate)
db.book.update({type:"novel"},{$set:{publisherDate:new Date()}},{multi:true})
update 命令的選項配置較多,為了簡化使用還可以使用一些快捷命令:
- updateOne:更新單個文檔。
- updateMany:更新多個文檔。
- replaceOne:替換單個文檔。
③使用 upsert 命令: 如果目標(biāo)文檔不存在,則執(zhí)行插入命令。
db.book.update({title:"myBook"},{$set:{tags:["nosql","mongodb"],type:"none",author:"fox"}},{upsert:true})
nMatched、nModified 都為0,表示沒有文檔被匹配及更新,nUpserted=1提示執(zhí)行了upsert動作。
④實現(xiàn) replace 語義: 如果更新描述中不包含任何操作符,就會實現(xiàn) replace 替換。
db.book.update({title:"myBook"},{mytitle:"newBook"})
⑤findAndModify 命令
findAndModify 兼容了查詢和修改指定文檔的功能,findAndModify 只能更新單個文檔。
// 將某個book文檔的收藏數(shù)(favCount)加1
db.book.findAndModify({query:{title:"book-0"},update:{$inc:{favCount:1}}
})
該操作會返回修改前的 “舊” 數(shù)據(jù),并完成對文檔的修改。
// 可以指定 new 選項,返回修改后的 “新” 數(shù)據(jù)。
db.book.findAndModify({query:{title:"book-0"},update:{$inc:{favCount:1}},new:true
})
與 findAndModify 語義相近的命令如下:
- findOneAndUpdate:更新單個文檔并返回更新前(或更新后)的文檔。
- findOneAndReplace:替換單個文檔并返回替換前(或替換后)的文檔。
回到目錄…
3.4 刪除文檔
①使用 remove 刪除
- remove 命令需要配合查詢條件使用;
- 匹配查詢條件的文檔會被刪除;
- 指定一個空文檔條件會刪除所有文檔;
db.book.remove({title:"book-5"}) //刪除某個標(biāo)題的書籍
db.book.remove({favCount:{$lt:30}}) //刪除數(shù)量少于30的書籍
db.book.remove({}) //刪除所有記錄
db.book.remove() //報錯
remove 命令會刪除匹配條件的全部文檔,如果希望明確限定只刪除一個文檔,則需要指定 justOne 參數(shù),命令格式如下:
db.collection.remove(query,justOne)
// 示例: 刪除滿足type:novel條件的首條記錄
db.book.remove({type:"novel"},true)
②使用 delete 刪除 (官方推薦)
db.book.deleteMany({}) //刪除集合下全部文檔
db.book.deleteMany({type:"novel"}) //刪除 type等于 novel 的全部文檔
db.book.deleteOne({type:"travel"}) //刪除 type等于 travel 的一個文檔
③返回被刪除文檔
如果希望獲得被刪除的文檔,可以使用 findOneAndDelete,但只能刪除并返回第一條結(jié)果:
db.books.findOneAndDelete({type:"novel"})
除了在結(jié)果中返回刪除文檔,還允許定義“刪除的順序”,即按照指定順序刪除找到的第一個文檔:
db.books.findOneAndDelete({type:"novel"},{sort:{favCount:1}})
回到目錄…
四、安全認(rèn)證
4.1 創(chuàng)建管理員賬號
# 設(shè)置管理員用戶名密碼需要切換到admin庫
use admin
# 創(chuàng)建管理員
db.createUser({user:"root",pwd:"123456",roles:["root"]})
# 查看所有用戶信息
show users
# 刪除用戶
db.dropUser("root")
4.2 創(chuàng)建應(yīng)用數(shù)據(jù)庫用戶
use library
db.createUser({user:"wsy",pwd:"123456",roles:["dbOwner"]})
常用角色權(quán)限:
權(quán)限名 | 描述 |
---|---|
read | 允許用戶讀取指定數(shù)據(jù)庫 |
readWrite | 允許用戶讀寫指定數(shù)據(jù)庫 |
dbAdmin | 允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計或訪問system.profile |
dbOwner | 允許用戶在指定數(shù)據(jù)庫中執(zhí)行任意操作,增、刪、改、查等 |
userAdmin | 允許用戶向system.users集合寫入,可以在指定數(shù)據(jù)庫里創(chuàng)建、刪除和管理用戶 |
clusterAdmin | 只在admin數(shù)據(jù)庫中可用,賦予用戶所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限 |
readAnyDatabase | 只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀權(quán)限 |
readWriteAnyDatabase | 只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限 |
userAdminAnyDatabase | 只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限 |
dbAdminAnyDatabase | 只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的dbAdmin權(quán)限 |
root | 只在admin數(shù)據(jù)庫中可用。超級賬號,超級權(quán)限 |
4.3 啟動和連接 (校驗方式)
①默認(rèn)情況下,MongoDB 不會啟用鑒權(quán),以鑒權(quán)模式啟動 MongoDB
mongod -f ../conf/mongod.conf --auth
②啟用鑒權(quán)之后,連接 MongoDB 的相關(guān)操作都需要提供身份認(rèn)證
mongo -u用戶名 -p密碼 --authenticationDatabase=用戶所在庫
mongo -uroot -p123456 --authenticationDatabase=admin
mongo -uwsy -p123456 --authenticationDatabase=library
管理員可以看到并操作所有數(shù)據(jù)庫:
普通用戶只能看到并操作對應(yīng)的數(shù)據(jù)庫:
回到目錄…
總結(jié):
提示:這里對文章進(jìn)行總結(jié):
本文是對MongoDB的學(xué)習(xí),學(xué)習(xí)了針對數(shù)據(jù)庫、集合、文檔的增刪查改操作,并且學(xué)習(xí)創(chuàng)建用戶及權(quán)限、以安全認(rèn)證的方式啟動MongoDB。之后的學(xué)習(xí)內(nèi)容將持續(xù)更新!!!