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