MongoDB 資料模型
資料模型
一、設計資料庫(Database)
該資料庫與MonogDB資料庫不是一個東西,MongoDB資料庫表示的是MongoDB這個產品,以及它的用處。但是此處的資料庫,是MongoDB裡面的一個結構物件,我們可以參考MySql資料庫的資料庫。MongoDB中的資料庫,它可以讓我們執行新增使用者、訪問集合等操作。
在MongoDB中建立一個數據庫有兩種方法:
- 在MongoDB shell中使用use database命令,該命令是如果存在該資料庫,將焦點切換到該資料庫,如果該資料庫不存在,則會隱式的建立該資料庫,並且將焦點切換到該資料庫,然後我們可以操作該資料庫中集合與資料等。焦點資料庫中我們就可以使用db關鍵字代表當前資料庫,該方法只能在MongoDB shell中使用。
- 我們可以使用Connection物件的方法getDB()來建立一個Database物件,比如:con = new Mongo(“localhost”); mdb = con.getDB(“myDB”); mdb.getName();或者mdb = connect(“localhost:27017/myDB”); mdb.getName()。該方法可以在shell中使用,也可以在JavaScript檔案中使用。
二、MongoDB的基礎概念
連線(Connection)、集合(Collection)、文件(Document)是MongoDB的重要的基礎元件,瞭解這些元件能夠幫助大家對MongoDB的儲存資料有更清晰的認識,如果大家資料Mysql、orcale等關係型資料庫的話。理解這些東西非常簡單,只需要把一些觀念轉變一下即可。
1、連線(Connection)
顧名思義,連線物件能讓我們訪問MongoDB伺服器,它表示到伺服器的連線,讓我們能夠獲取首選項。
要建立Connection物件,我們可以在MongoDB shell中使用Mongo(host:port),,或者在JavaScript檔案中使用var con = new Mongo(host:port),或者使用connect(url, user, password)方法,該方法等同於Mongo().getDB();
2、文件(Document)
文件MongoDB的核心,其是MongoDB存放資料的最最基本的一個單位,每一個文件存放了MongoDB的一條資料。我們可以對比下關係型資料庫中的行,其概念雖然不一致,但是其作用是一致的,都是表示一條資料,只不過關係型資料庫中的一條資料是放在一張表中的一行,而MongoDB的一條資料則是一個集合中的一個文件。
MongoDB的存放資料是以BSON格式儲存到文件中的,也就是說,每一個文件都是一條BSON資料,例如:{“name”:”test”,”age”:18}.其內部有兩個鍵name、age,其值分別為test、18. 文件中的鍵值對的是有順序的,比如{“age”:18,”name”:”test”}和上一條是兩條資料,而不是同一條。
文件中每個鍵對應的值,不僅僅是字串型別,可以是所有的資料型別:int、json、string、boolean等等,甚至於其值可以是一個嵌入的另一個文件。在MongoDB的文件中,其資料是非常靈活的,兩個完全不一樣的文件,可以放在同一個集合中,這在關係型資料庫中,是不能實現的,除非建立一個所有欄位都包含的表。在MongoDB的文件中則不需要。這也是MongoDB的一個非常nice的地方。
對於文件中的鍵,有幾點需要注意:
(1)鍵不能含有”\0”(空字元)。因為這個字元在文件中表示鍵的結尾。
(2)”.”和”$”是保留欄位,非常不建議使用,只有在特定的情況下才會使用,比如”.”字元,該字元在mongoDB中表示取其子欄位,所以如果你在鍵中使用了該欄位,取的就不是該欄位了。比如{”data.page”:1},這時候我們如果取”data.page”的值,就不是”data.page”這個鍵了,而是”page”欄位的值了。
(3)_開頭的鍵也是保留的,不建議使用。
(4) 鍵區分大小寫,”Foo”和”foo”是兩個不同的鍵。
(5)一個文件中鍵不能重複。
3、集合(collection)
集合表示多個文件的集合,相當於關係型資料庫的表(table),使用集合物件,可以對集合中的文件進行增刪改查操作。
訪問集合有兩種方式:
(1)在mongoDB shell中直接使用db.collectionName,該方式只適用與shell中。
(2)該方法可以在JavaScript檔案和shell中使用,mycollection = db.getCollection(“mycollection”);mycollection.find()。
MongoDB提供了很多方法,用於對集合進行一系列的操作。
上面的大部分型別都是顯而易見的,但是有必要詳細解釋一下物件 id型別。我們上面說了,物件 id型別是一個 12位元組的唯一 id。每個位元組 2位 16進位制數,因此整個 id型別是一個 24位的字串。
前面四個位元組代表從標準紀元開始的時間戳,以秒為單位。
接下來三個位元組表示機器號,MongoDB入門2——MongoDB資料型別一般是機器名的hash值。這可以保證不同機器產生的id不會衝突。
接下來兩個位元組表示程序id號,保證統一機器不同程序產生的id不衝突.
最後三個是計數器的計數值,對於任意一秒鐘,可以產生2^24個數.
我們之前提到過,如果不在插入的時候手動的新增_id鍵,那麼系統會自動新增一個。儘管MongoDB的id型別被設計成輕量級的,但是這樣還是會不好。畢竟伺服器建立這個還是會有開銷的。因此,這個工作一般會放到客戶端來做。