MongoDB入門上


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從數據庫中永久性的刪除文檔,在不使用參數調用的情況下,它會刪除一個集合內的所有文檔,它也可以

接受一個文檔作為條件刪除.如:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM