本文的目標是經過大量的示例,來更好的理解若是在Mongodb
中進行數據操做;sql
初入客戶端
剛利用 mongod
命令進入客戶端環境,此時對數據庫一無所知;mongodb
舉目四望,想知道如今有哪些數據庫,數據庫
show dbs;
由於是新裝的mongodb
環境,因此只看到了admin
和local
兩個默認就存在的數據庫;目光慢慢收回,那麼當前是處於哪一個數據庫上呢?數組
db;
經過上述這個命令,不只能夠知道當前在哪一個數據庫上;
如今切換到admin
數據庫上,轉一圈;服務器
use admin;
數據庫
這時候,筆者想要建立本身應用的數據庫school
, 用來存放一些班級學生信息;dom
use school;
use
命令:若是數據庫不存在,則建立數據庫,不然切換到指定數據庫;函數
忽然發現剛纔敲命令,寫錯了,寫成了use school1
;這時候,但願刪除school1
這個數據庫,就切換到該數據庫下,再鍵入刪除命令;code
use school1; db.dropDatabase();
集合Mongodb
中的集合至關於Mysql
中的表;索引
做爲一名優秀的「校長」,能適應高信息化社會發展,筆者須要爲學校下的各個年級、班級創建集合;建立集合能夠是顯式的,也能夠是隱式的;ip
經過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
下建立其餘數據庫的管理者,再由這些管理者在對應的數據庫下建立「可讀」或「可寫」的用戶;