
這是mongo基礎篇,后續會連續更新4篇
大家好我叫MongoDb,自從07年10月10gen團隊把我帶到這個世界來,我已經13歲多啦,現在越來越多的小伙伴在擁抱我,我很高興,我是NoSQL大家族的一員,我是C++的親兒子啦,為了大家更好的熟悉我,今天我先簡單從簡單的使用角度來介紹我自己,
首先還是先介紹一下我們的大家族NoSQL吧
NoSQL只是他簡稱,他的中文名叫 非關系型資料庫,外文名叫Not Only SQL,他是對關系型資料庫的一個補充(RDBMS),RDBMS追求資料存盤和查詢的高度結構化、嚴格的資料一致性;NOSQL不在乎形式,重點關心效率,NOSQL是高性能、無模式、高可擴展的分布式資料庫,NOSQL存盤包括四種型別:鍵值對存盤、列存盤、檔案存盤、圖形資料存盤,NoSQL就簡單介紹到這,這不是今天的重點,下面還是重點介紹一下我自己(MongoDb),呵呵!
MongoDb自我介紹
MongoDb是一個面向檔案存盤的鍵值對NOSQL資料庫,是一個最接近關系型資料庫的非關系資料庫,在資料存盤結構和查詢上使用BJOSN(類似于JSON)結構,BJOSN支持多層機構,在具體的使用程序中,更像是操作Javascript腳本,正因為MongoDb的無模式化,在實際應用中變得更加靈活,易于擴展,與RDBMS一樣,支持主鍵、索引、檢索等操作,由于非結構化所以不支持join查詢,
MongoDb的基本概念
具體的資料庫安裝就不在介紹了,網上一搜一大推,MongoDb采用BJON化的檔案存盤,所以其基本結構概念可以結合JSON聯想一下:欄位、檔案、集合、資料庫,這和RDBMS的屬性、列、表、資料庫是一一對應關系,下面以一個表格來對比說明一下:
|
RDBMS |
MongoDb |
||
|
概念 |
說明 |
概念 |
說明 |
|
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個資料庫:testdb001、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 |
具有資料庫testdb001、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
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝:

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/202189.html
標籤:其他
