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