MongoDB基本概念
1.文檔是MongoDB中數據的基本單元,類似於關系型數據庫的行(但比行復雜的多)
2.集合可以看成沒有模式的表
3.MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限
4.MongoDB自帶簡潔但功能強大的javascript shell,這個工具對於管理MongoDB實例和操作數據非常有用
5.每一個文檔都有一個特殊的鍵"_id",它在文檔所處的集合中是唯一的.
詳細介紹:
a)文檔
文檔是MongoDB的核心概念.多個鍵及其關聯的值有序的放置在一起便是文檔.
大多數語言都有想通的一種數據結構,比如:映射,散列或字典.在javascript里面,文檔表示為對象:
{"greeting":"Hello world","age":30}
這個文檔只有一個鍵"greeting",其對應的值為"Hello world".絕大數情況下,文檔會比這復雜的多,
經常會包含多個鍵值對:
{"greeting":"Hello world","Hello":"Refactor"}
文檔中的鍵值對是有序的,上面的文檔與下面的文檔是不同的:
{"Hello":"Refactor","greeting":"Hello world"}
文檔中的值可以是字符串,也可以是其他幾種數據類型.如例子中的"age"的值是整數
文檔中的鍵是字符串,除了少數例外的情況下,鍵可以是任意utf-8字符
鍵不能含有\0(空字符),這個字符表示鍵的結尾
.和$只有在特定的環境下才能使用,使用不當的話,驅動程序會提示
下划線"_"開頭的鍵是保留的,雖然這個並不是嚴格要求的
MongoDB不但區分類型,也區分大小寫,下面兩個文檔是不同的:
{"age":"30"}
{"age":30}
一下文檔也是不同的:
{"age":30}
{"Age":30}
MongoDB文檔不能有重復鍵
{"Hello":"Hello world","Hello":"Refactor"}這是不正確的
b)集合
集合是一組文檔,如果說文檔相當於關系型數據庫中的行,那么集合相當於表
集合是無模式的,這意味着一個集合里面的文檔可以是各種各樣的,下面兩個文檔可以存在同一個集合中:
{"Hello":"Refactor"}
{"Age":30}
注意,上面的文檔不光是值的類型不同(字符串和整數),他們的鍵也是不一樣的.因為集合里面可以放置任何文檔,
那么就有一個問題:還有必要使用多個集合嗎?要是沒必要對各種文檔划分模式,那么為什么還要使用多個結合呢?
理由如下:
1.把各種各樣的文檔都混在一個集合里面,開發者要么確保每次查詢只返回需要的文檔種類,要么讓執行查詢的
應用程序來處理所有不同類型的文檔.如:查詢博客文章,還要剔除那么包含有作者數據的文檔
2.在一個集合里面查詢特定類型的文檔在速度上不划算,分開做多個集合要快的多.如:集合里面有個標注類型的鍵
要查詢其值為"Refactor1","Refactor2"或"Refactor3"的文檔,就會很慢,如果按照名字分割成3個集合的話,查詢會
快的多(參見"子集合")
3.把同種類型的文檔放在一個集合里,這樣數據很集中.從只含有博客文章的集合里面查詢幾篇文章,會比從含有文章
和作者數據的集合里面查幾篇文章少消耗磁盤尋道操作.
4.當創建索引的時候,文檔會有附加的結構(尤其是有唯一索引的時候).索引是按照集合來定義的.把同種類型的文檔
放在同一個集合里面.使索引更有效.
集合名為滿足下列條件的utf-8字符串
1.集合名不能是空字符串""
2.集合名不能含有\0空字符,這個字符表示集合名的結尾
3.集合名不能以"system."開頭,這是為系統集合保留的前綴.如:system.users這個集合保存着數據庫的用戶信息
system.namespaces集合保存着所有數據庫集合的信息.
4.集合名不能包含保留字符"$"
子集合
組織集合的一種慣例是使用"."字符分開的按命名空間划分的子集合.如:一個帶有博客功能的應用可能包含兩個集合,
分別是blog.posts和blog.authors.這樣做的目的是為了使組織結構更好些,也就是說blog這個集合(可能根本就不存在)
及其子集合沒有任何關系.
很多MongoDB工具中都包含子集合
1.GridFS是一種存儲大文件的協議,使用子集合來存儲文件的元數據,這樣就與內容塊分開了
2.MongoDB的web控制台通過子集合的方式將數據組織在DBTOP部分
3.數據庫shell里面,db.blog代表blog集合,db.blog.posts代表blog.posts集合
在MongoDB中使用子集合是組織數據的最好方法.
c)數據庫
MongoDB中多個文檔組成集合,同樣多個集合組成數據庫.一個MongoDB實例可以有多個數據庫,
它們之間可視為完全獨立的.每個數據庫都有獨立的權限控制,即便是在磁盤上,不同的數據庫也放置
在不同的文件中.將一個應用的所有數據存儲在同一個數據庫中.
和集合一樣,數據庫也通過名字來標識,數據庫名必須滿足如下條件的utf-8字符:
1.不能是空字符串("")
2.不能含有''(空格),.,$,/,\和\0(空字符)
3.應全部小寫
4.最多64字節
之所以有這么限制,是因為數據庫名最終會變成文件系統里的文件.
有些數據庫名是保留的,可以直接訪問這些有特殊作用的數據庫,如:
1.admin
從權限的角度看,這是"root"數據庫.要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限.
一些特定的服務器端命令也只能從這個數據庫運行,如:列出所有的數據庫或者關閉服務器
2.local
這個數據庫不會被復制,可以用來存儲限於本地單台服務器的任意集合
3.config
當MongoDB用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息.
把數據庫的名字放在集合名前,得到就是集合的完全限定名,稱為命名空間.如:如果在cms數據庫中
使用blog.posts集合,那么這個集合的命名空間就是cms.blog.posts.命名空間不得超過121字節,
在實際應用中應該小於100字節.
d)MongoDB shell
MongoDB自帶一個javascript shell,可以從命令行與MongoDB實例交互.
1.運行shell
shell是功能完備的javascript解釋器,可以運行任何javascript程序:
2.MongoDB客戶端
shell更重要的用途它是MongoDB客戶端.開啟的時候,shell會連到MongoDB服務器的test數據庫,並將這個
數據庫連接賦值為全局變量db,這個變量是通過shell訪問MongoDB的主要入口點.
shell還有非javascript語法的擴展,這是為了方便SQL shell用戶而添加的,如:
選擇要使用的數據庫:
use test
可以通過db變量來訪問其中的集合,如db.users返回當前數據庫的users集合.
在shell中完成,CRUD
1.新增
insert函數添加一個文檔到集合里面,如:存儲一篇博客文章,首先,創建一個局部變量post,內容代表文檔的
javascript對象.
2.讀取
find會返回集合里面所有的文檔,若只想查看一個文檔,可以用findOne
find和findOne可以接受查詢文檔形式的限定條件,通過條件來查詢文檔.使用find時,shell自動
最多顯示20個匹配文檔
3.更新
update 接受兩個參數:一個是要更新文檔的限定條件,另一個是新的文檔.如:向博客中增加評論內容.
4.刪除
remove從數據庫中永久性的刪除文檔,在不使用參數調用的情況下,它會刪除一個集合內的所有文檔,它也可以
接受一個文檔作為條件刪除.如: