摘要:本文的目標(biāo)是通過大量的示例,來更好的理解如果在中進(jìn)行數(shù)據(jù)操作初入客戶端剛利用命令進(jìn)入客戶端環(huán)境,此時(shí)對數(shù)據(jù)庫一無所知舉目四望,想知道現(xiàn)在有哪些數(shù)據(jù)庫,因?yàn)槭切卵b的環(huán)境,所以只看到了和兩個(gè)默認(rèn)就存在的數(shù)據(jù)庫目光慢慢收回,那么當(dāng)前是處于哪個(gè)數(shù)據(jù)
本文的目標(biāo)是通過大量的示例,來更好的理解如果在Mongodb中進(jìn)行數(shù)據(jù)操作;
初入客戶端
剛利用 mongod命令進(jìn)入客戶端環(huán)境,此時(shí)對數(shù)據(jù)庫一無所知;
舉目四望,想知道現(xiàn)在有哪些數(shù)據(jù)庫,
show dbs;
因?yàn)槭切卵b的mongodb環(huán)境,所以只看到了admin和local兩個(gè)默認(rèn)就存在的數(shù)據(jù)庫;目光慢慢收回,那么當(dāng)前是處于哪個(gè)數(shù)據(jù)庫上呢?
db;
通過上述這個(gè)命令,不僅可以知道當(dāng)前在哪個(gè)數(shù)據(jù)庫上;
現(xiàn)在切換到admin數(shù)據(jù)庫上,轉(zhuǎn)一圈;
use admin;
數(shù)據(jù)庫
這時(shí)候,筆者想要創(chuàng)建自己應(yīng)用的數(shù)據(jù)庫school, 用來存放一些班級學(xué)生信息;
use school;
use命令:如果數(shù)據(jù)庫不存在,則創(chuàng)建數(shù)據(jù)庫,否則切換到指定數(shù)據(jù)庫;
突然發(fā)現(xiàn)剛才敲命令,寫錯(cuò)了,寫成了use school1;這時(shí)候,希望刪除school1這個(gè)數(shù)據(jù)庫,就切換到該數(shù)據(jù)庫下,再鍵入刪除命令;
use school1; db.dropDatabase();
集合
Mongodb中的集合相當(dāng)于Mysql中的表;
作為一名優(yōu)秀的“校長”,能適應(yīng)高信息化社會發(fā)展,筆者需要為學(xué)校下的各個(gè)年級、班級建立集合;創(chuàng)建集合可以是顯式的,也可以是隱式的;
通過show tables,看到數(shù)據(jù)庫下沒有任何集合;筆者顯式地創(chuàng)建“一年級一班的”集合;
db.createCollection("grade_1_1");
再次通過show tables就可以看到列表中有grade_1_1這個(gè)集合;
當(dāng)然,也可以隱式地創(chuàng)建,當(dāng)為集合插入數(shù)據(jù),集合不存在,這時(shí)候集合會自動創(chuàng)建;現(xiàn)在,不存在grade_1_2“一年級二班”這個(gè)集合,執(zhí)行下面語句,為“一年級二班”加入一個(gè)學(xué)生;
db.grade_1_2.insert({"name": "zhangsan", "age": "7", "sex": "0"});
通過show tables就可以看到grade_1_2這個(gè)集合了;
因?yàn)橐恍┨厥庠颍馍⒁荒昙壎?,那筆者這兒就不用繼續(xù)維護(hù)grade_1_2集合,
db.grade_1_2.drop();練習(xí)增查
清空上面的school數(shù)據(jù)庫
use school; db.dropDatabase(); use school; show tables;
創(chuàng)建一年級的3個(gè)班,并隨機(jī)添加 10 名學(xué)生;
for(grade_index in (grade = ["grade_1_1", "grade_1_2", "grade_1_3"])) { for (var i = 1; i <= 10; i++) { db[grade[grade_index]].insert({ "name": "zhangsan" + i, "sex": Math.round(Math.random() * 10) % 2, "age": Math.round(Math.random() * 6) + 3, "hobby": [] }); } }
查看一年級二班grade_1_2中的所有學(xué)生
db.getCollection("grade_1_2").find({})
查看一年級二班grade_1_2中所有年齡是 4 歲的學(xué)生
db.getCollection("grade_1_2").find({"age": 4})
查看一年級二班grade_1_2中所有年齡大于 4 歲的學(xué)生
db.getCollection("grade_1_2").find({"age": {$gt: 4}})
查看一年級二班grade_1_2中所有年齡大于 4 歲并且小于 7 歲的學(xué)生
db.getCollection("grade_1_2").find({"age": {$gt: 4, $lt: 7}})
查看一年級二班grade_1_2中所有年齡大于 4 歲并且性別值為0的學(xué)生
db.getCollection("grade_1_2").find({"age": {$gt: 4}, "sex": 0})
查看一年級二班grade_1_2中所有年齡小于 4 歲并且大于 7 歲的學(xué)生
db.getCollection("grade_1_2").find({$or: [{"age": {$lt: 4}}, {"age": {$gt: 6}}]})
查看一年級二班grade_1_2中所有年齡是 4 歲或 6 歲的學(xué)生
db.getCollection("grade_1_2").find({"age": {$in: [4, 6]}})
查看一年級二班grade_1_2中所有姓名帶zhangsan1的學(xué)生
db.getCollection("grade_1_2").find({"name": {$regex: "zhangsan1"}})
查看一年級二班grade_1_2中所有姓名帶zhangsan1和zhangsan2的學(xué)生
db.getCollection("grade_1_2").find({"name": { $in: [new RegExp(""zhangsan1"), new RegExp(""zhangsan2")] }})
查看一年級二班grade_1_2中所有興趣愛好有三項(xiàng)的學(xué)生
db.getCollection("grade_1_2").find({"hobby": {$size: 3}})
查看一年級二班`grade_1_2`中所有興趣愛好包括畫畫的學(xué)生
db.getCollection("grade_1_2").find({"hobby": "drawing"})
查看一年級二班`grade_1_2`中所有興趣愛好既包括畫畫又包括跳舞的學(xué)生
db.getCollection("grade_1_2").find({"hobby": {$all: ["drawing", "dance"]}})
查看一年級二班grade_1_2中所有興趣愛好有三項(xiàng)的學(xué)生的學(xué)生數(shù)目
db.getCollection("grade_1_2").find({"hobby": {$size: 3}}).count()
查看一年級二班的第二位學(xué)生
db.getCollection("grade_1_2").find({}).limit(1).skip(1)
查看一年級二班的學(xué)生,按年紀(jì)升序
db.getCollection("grade_1_2").find({}).sort({"age": 1})
查看一年級二班的學(xué)生,按年紀(jì)降序
db.getCollection("grade_1_2").find({}).sort({"age": -1})
查看一年級二班的學(xué)生,年齡值有哪些
db.getCollection("grade_1_2").distinct("age")
查看一年級二班的學(xué)生,興趣覆蓋范圍有哪些
db.getCollection("grade_1_2").distinct("hobby")
查看一年級二班的學(xué)生,男生(`sex`為 0)年齡值有哪些
db.getCollection("grade_1_2").distinct("age", {"sex": 0})練習(xí)刪除
一年級二班grade_1_2, 刪除所有 4 歲的學(xué)生
db.getCollection("grade_1_2").remove({"age": 4})
一年級二班grade_1_2, 刪除第一位 6 歲的學(xué)生
db.getCollection("grade_1_2").remove({"age": 6}, {justOne: 1})練習(xí)修改
一年級二班grade_1_2中,修改名為zhangsan7的學(xué)生,年齡為 8 歲,興趣愛好為 跳舞和畫畫;
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$set: {"age": 8, "hobby": ["dance", "drawing"]}})
一年級二班`grade_1_2`中,追加zhangsan7`學(xué)生興趣愛好唱歌;
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$push: {"hobby": "sing"}})
一年級二班`grade_1_2`中,追加zhangsan7`學(xué)生興趣愛好吹牛和打籃球;
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$push: {"hobby": {$each: ["brag", "play_basketball"]}}})
一年級二班`grade_1_2`中,追加`zhangsan7`學(xué)生興趣愛好唱歌和打籃球,要保證`hobby`數(shù)組不重復(fù);
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$addToSet: {"hobby": {$each: ["sing1", "play_basketball"]}}})
新學(xué)年,給一年級二班所有學(xué)生的年齡都增加一歲
db.getCollection("grade_1_2").update({}, {$inc: {"age": 1}}, {multi: true})
一年級二班grade_1_2中,刪除zhangsan7學(xué)生的sex屬性
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$unset: {"sex": 1}})
一年級二班grade_1_2中,刪除zhangsan7學(xué)生的hobby數(shù)組中的頭元素
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$pop: {"hobby": -1}})
一年級二班`grade_1_2`中,刪除`zhangsan7`學(xué)生的`hobby`數(shù)組中的尾元素
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$pop: {"hobby": 1}})
一年級二班`grade_1_2`中,刪除`zhangsan7`學(xué)生的`hobby`數(shù)組中的`sing`元素
db.getCollection("grade_1_2").update({"name": "zhangsan7"}, {$pull: {"hobby": "sing"}})練習(xí)分組
新建一個(gè)集合grade_1_4,記錄一年級四班在期中考試時(shí)的成績;
for (var i = 1; i <= 10; i++) { db.grade_1_4.insert({ "name": "zhangsan" + i, "sex": Math.round(Math.random() * 10) % 2, "age": Math.round(Math.random() * 6) + 3, "score": { "chinese": 60 + Math.round(Math.random() * 40), "math": 60 + Math.round(Math.random() * 40), "english": 60 + Math.round(Math.random() * 40) } }); }
統(tǒng)計(jì)每名學(xué)生在考試中的總分
db.grade_1_4.group({ key: {"name": 1}, cond: {}, reduce: function(curr, result) { result.total += curr.score.chinese + curr.score.math + curr.score.english; }, initial: { total : 0 } })
統(tǒng)計(jì)每名男生在考試中的總分
db.grade_1_4.group({ key: {"name": 1}, cond: {"sex": 0}, reduce: function(curr, result) { result.total += curr.score.chinese + curr.score.math + curr.score.english; }, initial: { total : 0 } })
統(tǒng)計(jì)每名男生在考試中的總分及平均分
db.grade_1_4.group({ key: {"name": 1}, cond: {"sex": 0}, reduce: function(curr, result) { result.total += curr.score.chinese + curr.score.math + curr.score.english; }, initial: { total : 0 }, finalize: function(item) { item.avg = (item.total / 3).toFixed(2); return item; } })練習(xí)聚合
根據(jù)姓名分組, 并統(tǒng)計(jì)人數(shù)
db.getCollection("grade_1_4").aggregate([ {$group: {_id: "$name", num: {$sum: 1}}} ])
根據(jù)姓名分組, 并統(tǒng)計(jì)人數(shù),過濾人數(shù)大于 1 的學(xué)生
db.getCollection("grade_1_4").aggregate([ {$group: {_id: "$name", num: {$sum: 1}}}, {$match: {num: {$gt: 1}}} ])
統(tǒng)計(jì)每名學(xué)生在考試中的總分
db.getCollection("grade_1_4").aggregate([ {$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}} ])
統(tǒng)計(jì)每名男生在考試中的總分
db.getCollection("grade_1_4").aggregate([ {$match: {sex: 0}}, {$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}} ])
統(tǒng)計(jì)每名男生在考試中的總分, 總分降序
db.getCollection("grade_1_4").aggregate([ {$match: {sex: 0}}, {$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}}, {$sort: {score: 1}} ])練習(xí)權(quán)限 創(chuàng)建用戶
要讓權(quán)限生效,需要mongo服務(wù)器啟動時(shí)添加--auth選項(xiàng);
創(chuàng)建用戶school_admin,只能對school數(shù)據(jù)庫進(jìn)行讀寫操作;
use school; db.createUser({ user: "school_admin", pwd: "school_admin", roles: [{role: "readWrite", db: "school"}] })
關(guān)于第三個(gè)參數(shù)角色,看下表:
角色名 | 描述 |
---|---|
Read | 允許用戶讀取指定數(shù)據(jù)庫 |
readWrite | 允許用戶讀寫指定數(shù)據(jù)庫 |
dbAdmin | 允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問system.profile |
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)限 |
如果未通過驗(yàn)證,進(jìn)行查詢,
會得到如下的提示:
Error: error: { "ok" : 0, "errmsg" : "not authorized on school to execute command { find: "grade_1_2", filter: {} }", "code" : 13, "codeName" : "Unauthorized" }
如果執(zhí)行驗(yàn)證代碼:注意,要在注冊時(shí)所在的數(shù)據(jù)庫中驗(yàn)證
use school; db.auth("用戶名", "密碼")查看所有用戶
db.getUsers()刪除用戶
先移到用戶注冊的數(shù)據(jù)庫,然后移除指定用戶 school_admin
db.dropUser("school_admin")
關(guān)于用戶的注冊位置,筆者的理解是在admin下創(chuàng)建其他數(shù)據(jù)庫的管理者,再由這些管理者在對應(yīng)的數(shù)據(jù)庫下創(chuàng)建“可讀”或“可寫”的用戶;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19116.html
摘要:所以,如果你很少對集合進(jìn)行讀取操作,建議不使用索引內(nèi)存使用由于索引是存儲在內(nèi)存中你應(yīng)該確保該索引的大小不超過內(nèi)存的限制。如果索引的大小大于內(nèi)存的限制,會刪除一些索引,這將導(dǎo)致性能下降。 本文圍繞索引、游標(biāo)兩部分進(jìn)行探索,對MongoDB數(shù)據(jù)庫的索引部分有一個(gè)大概的了解; 索引 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符...
摘要:小練習(xí)作者本文首發(fā)博客功能基于進(jìn)行登錄,注冊,留言的簡單網(wǎng)站。所以這個(gè)小練習(xí),從一個(gè)簡單的方面入手,希望能給踩過同樣多坑的同路人一點(diǎn)啟發(fā)。就意味著要重新登錄。的作用是進(jìn)行進(jìn)程守護(hù),當(dāng)你的意外的停止的時(shí)候,進(jìn)行重啟。 Vue+Koa+Mongodb 小練習(xí) 作者: Pawn 本文首發(fā): Pawn博客 功能: 基于vue koa mongodb進(jìn)行登錄,注冊,留言的簡單網(wǎng)站。 體驗(yàn)地址: ...
摘要:本文源碼簡介之前剛?cè)腴T并做好了一個(gè)簡而全的純?nèi)彝暗捻?xiàng)目,數(shù)據(jù)都是本地模擬請求的詳情請移步這里為了真正做到數(shù)據(jù)庫的真實(shí)存取,于是又開始入門了并以此來為之前的頁面寫后臺數(shù)據(jù)接口。 本文源碼:Github 簡介: 之前剛?cè)腴Tvue并做好了一個(gè)簡而全的純vue2全家桶的項(xiàng)目,數(shù)據(jù)都是本地 json 模擬請求的;詳情請移步這里:vue-proj-demo 為了真正做到數(shù)據(jù)庫的真實(shí)存取,于是又...
摘要:利用中間件實(shí)現(xiàn)異步請求,實(shí)現(xiàn)兩個(gè)用戶角色實(shí)時(shí)通信。目前還未深入了解的一些概念。往后會寫更多的前后臺聯(lián)通的項(xiàng)目。刪除分組會連同組內(nèi)的所有圖片一起刪除。算是對自己上次用寫后臺的一個(gè)強(qiáng)化,項(xiàng)目文章在這里。后來一直沒動,前些日子才把后續(xù)的完善。 歡迎訪問我的個(gè)人網(wǎng)站:http://www.neroht.com/? 剛學(xué)vue和react時(shí),利用業(yè)余時(shí)間寫的關(guān)于這兩個(gè)框架的訓(xùn)練,都相對簡單,有的...
摘要:準(zhǔn)備數(shù)據(jù)結(jié)構(gòu)這個(gè)以對一個(gè)簡單的通訊錄進(jìn)行插入查詢更新刪除記錄為例,中包含和兩個(gè)字段下載還沒出官方的驅(qū)動包,是現(xiàn)在比較流行的第三方包,能找到的相關(guān)資料也比較多。準(zhǔn)備實(shí)現(xiàn)對的增刪改查操作,先想了下怎么寫測試案例。查找,通過查找該條記錄。 環(huán)境聲明:go version go1.11MongoDB server version 4.0.3 背景 這是我第一次接觸golang和MongoDB,...
閱讀 3461·2019-08-30 15:55
閱讀 2058·2019-08-30 15:44
閱讀 1464·2019-08-30 12:47
閱讀 752·2019-08-30 11:05
閱讀 1637·2019-08-30 10:54
閱讀 663·2019-08-29 16:07
閱讀 3575·2019-08-29 14:17
閱讀 2234·2019-08-23 18:31