我叫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),該_id是mongodb系統自動生成的相似惟一主鍵,能夠很快的去生成和排序,包含 12 bytes,含義是:
1.前 4 個字節表示建立 unix 時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時
2.接下來的 3 個字節是機器標識碼
3.緊接的兩個字節由進程 id 組成 PID
4.最後三個字節是隨機數
固然_id也能夠根據實際須要自定義賦值。
好了今天就先寫到這,經過本篇文章對mongo有了一個初步的認識瞭解,下一篇文章,咱們在一塊兒詳聊查詢,mongo的查詢仍是有不少聊的。謝謝您的查看。
END
原創不易,感謝掃描支持,獲取更多精彩,謝謝: