我叫MongoDb,不懂個人看完個人故事您就入門啦!

我叫MongoDb,不懂個人看完個人故事您就入門啦!

這是mongo基礎篇,後續會連續更新4篇程序員

你們好我叫MongoDb,自從07年10月10gen團隊把我帶到這個世界來,我已經13歲多啦,如今愈來愈多的小夥伴在擁抱我,我很高興。我是NoSQL你們族的一員,我是C++的親兒子啦。爲了你們更好的熟悉我,今天我先簡單從簡單的使用角度來介紹我本身。mongodb

首先仍是先介紹一下咱們的你們族NoSQL吧數據庫

NoSQL只是他簡稱,他的中文名叫 非關係型數據庫,外文名叫Not Only SQL。他是對關係型數據庫的一個補充(RDBMS)。RDBMS追求數據存儲和查詢的高度結構化、嚴格的數據一致性;NOSQL不在意形式,重點關心效率,NOSQL是高性能、無模式、高可擴展的分佈式數據庫,NOSQL存儲包括四種類型:鍵值對存儲、列存儲、文檔存儲、圖形數據存儲。NoSQL就簡單介紹到這,這不是今天的重點,下面仍是重點介紹一下我本身(MongoDb),呵呵!json

MongoDb自我介紹數據結構

MongoDb是一個面向文檔存儲的鍵值對NOSQL數據庫,是一個最接近關係型數據庫的非關係數據庫。在數據存儲結構和查詢上使用BJOSN(相似於JSON)結構,BJOSN支持多層機構,在具體的使用過程當中,更像是操做Javascript腳本。正由於MongoDb的無模式化,在實際應用中變得更加靈活,易於擴展。與RDBMS同樣,支持主鍵、索引、檢索等操做,因爲非結構化因此不支持join查詢。app

MongoDb的基本概念分佈式

具體的數據庫安裝就不在介紹了,網上一搜一大推。MongoDb採用BJON化的文檔存儲,因此其基本結構概念能夠結合JSON聯想一下:字段、文檔、集合、數據庫,這和RDBMS的屬性、列、表、數據庫是一一對應關係。下面以一個表格來對比說明一下:函數

 

RDBMS性能

MongoDbspa

概念

說明

概念

說明

database

數據庫

database

數據庫

table

collection

集合

row

document

文檔:對應的一個BJSON

column

field

字段:BJSON中的具體某一個字段

 

簡單的一個表格顯示還不夠直觀,那咱們在來一張形象的圖片來講明一下吧!

用戶權限管理

在生成環境數據庫管理中,數據庫權限是一個很重要的功能。在具體的權限上,須要針對全局的權限控制,須要精確到具體的數據的權限,在具體的權限分類上包括:讀、讀寫、管理員等權限。下面列表介紹mongodb的內置權限:

權限名稱

權限說明

read

容許用戶讀取指定數據庫

readWrite

容許用戶讀寫指定數據庫

dbAdmin

容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile

userAdmin

容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶

clusterAdmin

只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。

readAnyDatabase

只在admin數據庫中可用,賦予用戶全部數據庫的讀權限

readWriteAnyDatabase

只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限

userAdminAnyDatabase

只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限

dbAdminAnyDatabase

只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。

root

只在admin數據庫中可用。超級帳號,超級權限

經過上面的表,咱們能夠得出:根據權限的做用範圍上來看,權限分爲了兩大類權限:針對每一庫的權限、針對所有數據庫的權限。根據不一樣的權限分類,在賦值格式上也有必定差別,在具體的用戶權限分配上,一個用戶能夠同時分配多個權限。

新增用戶時權限初始化格式爲:

針對所有數據庫權限初始化命令格式:

db.createUser({user:"用戶名",pwd:"密碼",roles:["權限值"]})

針對指定數據庫權限初始化命令格式:

db.createUser({user:"用戶名",pwd:"密碼",roles:[ {role:"權限值",db:"對應的數據庫"},{role:"權限值",db:"對應的數據庫"}….]})

這樣說可能不怎麼好理解,那麼咱們仍是以實際工做的使用狀況來舉例說明。

條件假設:有3個數據庫:testdb00一、testdb002

須要給如用戶分配對應的權限

用戶

須要分配的權限

具體的命令

adminRoot

超級帳號,具備全部數據庫的所有操做權限

use admin

db.createUser({user:"adminRoot",pwd:"123",roles:["root"]})

adminWrite

超級寫帳號,具備全部數據庫的讀寫操做權限

use admin

db.createUser({user:"adminWrite",pwd:"123",roles:["readWriteAnyDatabase"]})

adminRead

超級寫帳號,具備全部數據庫的讀操做權限

use admin

db.createUser({user:"adminRead",pwd:"123",roles:["readAnyDatabase"]})

001Write

具備數據庫testdb001的讀寫操做權限

use admin

db.createUser({user:"001Write",pwd:"123",roles:[ {role:"readWrite",db:" testdb001"}]})

001Read

具備數據庫testdb001的讀操做權限

use admin

db.createUser({user:"001Read",pwd:"123",roles:[ {role:"read",db:" testdb001"}]})

012Write

具備數據庫testdb00一、testdb002的讀寫操做權限

use admin

db.createUser({user:"001Write",pwd:"123",roles:[ {role:"readWrite",db:" testdb001"},{role:"readWrite",db:" testdb002"}]})

經過實際舉例,應該對權限的新增初始化操做命令有了理解,那麼下面咱們就來對權限的根據新操做命令簡單聊聊,其實根系和初始化具體的權限格式是一至的,具體以下:

針對所有數據庫權限更新命令格式:

db.updateUser("被更新用戶名",{pwd:"更新後的密碼",roles:["權限值"]})

針對指定數據庫權限更新命令格式:

db.updateUser("被更新用戶名",{pwd:"更新後的密碼",roles:[{role:"權限值",db:"對應的數據庫"},{role:"權限值",db:"對應的數據庫"}….]})

注意:updateUser的第二個參數有兩個節點:pwd和roles。若是不須要更新某一節點的數據,那麼直接不要該節點便可。

實例:繼續上面的實例繼續操做

用戶更新述求

具體的命令

更新用戶adminRoot的密碼爲111111

use admin

db.updateUser("adminRoot",{pwd:"111111"})

更新001Write的同時具備testdb001和testdb002的寫權限

use admin

db.updateUser("adminWrite",{roles:[ {role:"readWrite",db:" testdb001"},{role:"readWrite",db:" testdb002"}]})

更新001Read的同時具備testdb001和testdb002的讀權限,而且密碼也更新爲111111

use admin

db.updateUser("001Read",{ pwd:"111111",roles:[ {role:"read",db:" testdb001"},{role:"read",db:" testdb002"}]})

 

數據庫(database)

具體的數據庫概念和RDBMS一致,一個mongodb能夠建立多個數據庫,不一樣數據庫也能夠存儲在不一樣的mongodb。系統的默認數據庫包括:admin(存儲用戶權限相關)、config(配置信息)、local(日誌信息)。針對數據庫咱們經常使用的操做包括:建立、刪除。具體的實現以下:

建立:use 數據庫名稱

當數據庫名稱不存在時,系統自動建立(建立後不能顯示,須要向裏面插入數據纔會顯示),存在則切換。

刪除:首先要切換到對於的數據庫,而後在執行dropDatabase命令

use 被刪除的數據庫名稱

db.dropDatabase()

 

集合(Collection)

集合是mongodb中對數據存儲的一個分組,和關係數據庫中的表是對應關係。集合中存儲的文檔數據的無固定格式,能夠自由存儲不一樣格式的bjson數據,可是在實際使用中,咱們仍是存儲同一類型的bjson數據。集合的常見的操做命令以下:

建立集合:

db.createCollection(集合名稱,集合規則),其中第二次參數爲一個json數據,非必填,具體的參數節點爲:

集合規則:{ capped :選填bool類型:設置改集合是否爲一個固定集合,

true:表明固定集合,集合中的數據不可修改,與size配對使用,表明當集合達到指定大小後,會自動覆蓋歷史數據(最早添加的數據),

size:選填數字類型:指定集合的最大存儲數據(字節數),當集合達到指定大小後,會自動覆蓋歷史數據(最早添加的數據) }

max: 選填數字類型:指定集合的最大存儲的文檔總個數,當文檔個數大於max值時,會自動替換歷史文檔

}

collection刪除:

db.集合名稱.drop();

 

文檔(Document)

文檔就一組鍵值(key-value)對數據(一個BJON),具體的一個文檔結構能夠多層嵌套,不一樣文檔間的數據結構能夠不同,而且相同節點的數據類型也可不同,這是與RDBMS最大的區別所在,這也奠基了MongoDB的高可擴展性。其實簡單的說就是一個一個的jon格式的數據。

文檔常見的幾個操做命令彙總:

操做

命令格式

插入數據

db.集合名稱.insert(json對象)  json能夠是單個數據,也能夠是一個集合列表

更新數據

db. 集合名稱.update(query , update,option)

query :被更新文檔條件json

update:更新後的文檔json

option:更新方式json,參數格式爲{ upsert: boolean, multi : boolean }

upsert:非必填參數,若是不存在是否新增,當值爲true時,若是沒有符合條件的數據,就插入數據, ,默認爲false

multi: 非必填參數,是否更新符合要求的全部數據,當值爲true時,符合條件的數據所有更新,默認爲false

刪除數據

db.集合名稱.remove(query , justOne )

query :(可選)刪除的文檔的條件。

justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,則刪除全部匹配條件的文檔。

查詢數據

db.集合名稱.find(jison對象查詢條件)

 

字段

字段就很好理解了,就是文檔中的json數據的每個節點。

經過對mongodb的操做簡單介紹,其實咱們不難發現如下一些特性:

1.不管是對文檔的增、刪、改、查操做的參數一切皆json,在實際操做的時候,按照json方式來操做便可。

2.數據庫和集合均可以在使用是自動建立:

2.1 use 切換數據庫時,若是沒有數據庫自動建立;

2.2 db.集合.insert() 當集合不存在時,系統自動建立集合。

Mongodb的這一些特性用起來是否是很爽的感受。下面從數據庫的建立,到文檔的總體操做流程寫一些演示實例,來加深印象。

操做

命令格式

鏈接到mongdb

mongo

use admin

db.auth("用戶名","用戶密碼")

建立數據庫 bd001和表user001

use bd001

db.createCollection("user001")

建立數據庫 bd002和user002

use bd002

db.createCollection("user002")

查看全部數據庫

show dbs

輸出結果

admin   0.000GB

config  0.000GB

local   0.000GB

bd001  0.000GB

bd002  0.000GB

刪除集合user002

use db002

db.user002.drop()

刪除數據庫db002

use db002

db. dropDatabase()

向表user001插入一條數據

use db001

db.user001.insert({name:」程序員修煉之旅」,age:2})

向表user001插入兩條數據

use db001

db.user001.insert([

{name:"mongodb",age:12,type:"database"},

{"name":".net",from:"U.S.A"}

])

向表user001插入三條數據

use db001

db.user001.insert([

{name:"zhangsan",age:12,sex:"man"},

{name:"zhangsan",age:18,sex:"woman"},

{name:"zhangsan",age:22,sex:"man"}

])

查詢一下表中的數據狀況

use db001

db.user001.find()

查詢結果:

{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序員修煉之旅", "age" : 2 }

{ "_id" : ObjectId("5fa0abb495368a0bf20f38d0"), "name" : ".net", "from" : "U.S.A" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d1"), "name" : "zhangsan", "age" : 12, "sex" : "man" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 18, "sex" : "woman" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 22, "sex" : "man" }

查詢表中name="程序員修煉之旅"的數據

use db001

db.user001.find({name: "程序員修煉之旅"})

查詢結果:

{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序員修煉之旅", "age" : 2 }

修改表中name="程序員修煉之旅"的數據的age=66,並新增一個節點from節點

use db001

db.user001.update({name: "程序員修煉之旅"},{$set:{age:66,from: "CDU"}})

查看修改後的數據

use db001

db.user001.find({name: "程序員修煉之旅"})

查詢結果:

{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序員修煉之旅", "age" : 66,from: "CDU"}

數據已是修改後的數據了

修改表中name=" zhangsan"的數據的age=88,而且只修改一條符合要求的數據

use db001

db.user001.update({name: "zhangsan"},{$set:{age:88}},{ multi:false})

查看name=" zhangsan"修改後的數據,是否只有一條數據的age被修改成88?

use db001

db.user001.find({name: "zhangsan"})

查詢結果:

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d1"), "name" : "zhangsan", "age" : 88, "sex" : "man" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 18, "sex" : "woman" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 22, "sex" : "man" }

只有第一條的age被修改成了88

修改表中name=" zhangsan"的數據的age=99,修改符合要求的全部數據

use db001

db.user001.update({name: "zhangsan"},{$set:{age:99}},{ multi:true})

查看name=" zhangsan"修改後的數據,是否只全部數據的age被修改成99?

use db001

db.user001.find({name: "zhangsan"})

查詢結果:

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d1"), "name" : "zhangsan", "age" : 99, "sex" : "man" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 99, "sex" : "woman" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 99, "sex" : "man" }

name="zhangsan"的全部數據age被修改成了99

修改name="lisi"的age=77

use db001

db.user001.update({name: "lisi"},{$set:{age:77}})

查看數據修改結果

因爲沒有name=lisi的數據,全部查詢不到數據

use db001

db.user001.find({name: "lisi"})

查詢結果:

無數據

修改name="lisi"的age=77,若是沒有則新增

use db001

db.user001.update({name: "lisi"},{$set:{age:77}},{ upsert:true})

查看數據修改結果

新增了一條name="lisi"的數據

use db001

db.user001.find({name: "lisi"})

查詢結果:

{ "_id" : ObjectId("5fa0b3731b875939723ffe26"), "name" : "lisi", "age" : 77 }

刪除一條name="zhangsan"的數據

use db001

db.user001.rmove({name: "zhangsan"},1)

查看刪除結果

use db001

db.user001.find({name:"zhangsan"})

查詢結果:

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 18, "sex" : "woman" }

{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 22, "sex" : "man" }

name="zhangsan"的數據數據由原來的3條變爲了2條,被刪除了一條

刪除全部name="zhangsan"的數據

use db001

db.user001.rmove({name: "zhangsan"})

查看刪除結果

use db001

db.user001.find({name:"zhangsan"})

查詢結果:

無數據

name="zhangsan"的數據數據被所有刪除了

經過上面的實際操做,咱們發現全部新增文檔都會自動生成一個節點」_id」 ObjectId),該_idmongodb系統自動生成的相似惟一主鍵,能夠很快的去生成和排序,包含 12 bytes,含義是:

1.前 4 個字節表示建立 unix 時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時

2.接下來的 3 個字節是機器標識碼

3.緊接的兩個字節由進程 id 組成 PID

4.最後三個字節是隨機數

https://www.runoob.com/wp-content/uploads/2013/10/2875754375-5a19268f0fd9b_articlex.jpeg

固然_id也能夠根據實際須要自定義賦值。

好了今天就先寫到這,經過本篇文章對mongo有了一個初步的認識瞭解,下一篇文章,咱們在一塊兒詳聊查詢,mongo的查詢仍是有不少聊的。謝謝您的查看。

END
原創不易,感謝掃描支持,獲取更多精彩,謝謝:

相關文章
相關標籤/搜索