成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

練習(xí) MongoDB 操作 —— 數(shù)據(jù)操作(一)

printempw / 490人閱讀

摘要:本文的目標(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)境,所以只看到了adminlocal兩個(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中所有姓名帶zhangsan1zhangsan2的學(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)證用戶

如果未通過驗(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

相關(guān)文章

  • 練習(xí) MongoDB 操作 —— 索引篇(二)

    摘要:所以,如果你很少對集合進(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è)文件并選取那些符...

    luqiuwen 評論0 收藏0
  • Vue+Koa+Mongodb練習(xí)

    摘要:小練習(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)地址: ...

    趙春朋 評論0 收藏0
  • 基于 Vue2+Node+mongoDB 的前后端分離全棧練手小項(xiàng)目

    摘要:本文源碼簡介之前剛?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í)存取,于是又...

    jay_tian 評論0 收藏0
  • 些基于React、Vue、Node.js、MongoDB技術(shù)棧的實(shí)踐項(xiàng)目

    摘要:利用中間件實(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)練,都相對簡單,有的...

    tangr206 評論0 收藏0
  • 用Go語言借助mgo實(shí)現(xiàn)個(gè)對MongoDB進(jìn)行增刪改查的demo

    摘要:準(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,...

    Jingbin_ 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<