標籤:
六、資料模型引用文檔
我們已經知道MongoDB以文檔的形式儲存資料,而文檔是JSON風格的資料結構,由一系列的“欄位名-值”對組成,如下所示
{ "item": "pencil", "qty": 500, "type": "no.2" }
大多使用者可訪問的資料結構是文檔,這些文檔可以表示很多含義,包括:
- 所有資料庫記錄。
- 查詢選取器,定義選擇什麼樣的記錄用以讀取、更新和刪除操作。
- 更新定義,定義需要修改哪些欄位。
- 索引指定,定義對哪些欄位加索引。
- 用於MongoDB報道以及配置的資料輸出,例如serverStatus的輸出和複製集配置文檔。
文檔格式
MongoDB在磁碟上以BSON的序列化格式儲存文檔。BSON就是JSON文檔的二進位表現,儘管BSON包含了比JSON更多的資料類型。
mongo的JavaScript指令碼與MongoDB語言磁碟機用於在BSON和語言有關的文檔表現形式之間轉換。
文檔結構
文檔的形式如下
{ field1: value1, field2: value2, field3: value3, ... fieldN: valueN}
欄位的值可以是任意的BSON資料類型,也包括其他文檔、數組和文檔數組。下面的範例文件包含了各種類型
var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date(‘Jun 23, 1912‘), death: new Date(‘Jun 07, 1954‘), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : NumberLong(1250000) }資料庫引用
因為MongoDB的文檔結構自由靈活不固定,所以這使得MongoDB不支援串連操作。資料去正常化儲存,或者儲存有關的資料到文檔中,可以免去對串連的需要,當然這有可能導致有關的資訊被儲存在不同的文檔中,而且通常這些文檔位於不同的集合甚至不同的資料庫中。
MongoDB的應用程式如要將不同的文檔聯絡起來,可以使用以下兩種方法中的一種:
- 手動引用,在一個文檔中儲存另一個文檔的_id欄位。這樣,應用程式可以使用一個二次查詢來返回需要的資料。這些引用在大多數情況下都很簡單並且足夠用。
- DBRefs,一個文檔中引用另一個文檔,引用內容包括:被引用的文檔的_id欄位,集合名,甚至還可以有資料庫名。通過包含這些名稱,DBRefs可以用一個集合中的文檔簡單方便地與位於其他集合中的文檔聯絡起來。為瞭解析DBRefs,程式也需要執行額外的查詢才能得到被引用的文檔。很多驅動都有一些協助方法來自動為DBRef產生查詢,不過驅動不會自動解析DBRefs產生文檔(一些社區支援的驅動可以切換行為從而有可能可以自動解析DBRef為文檔)。DBRefs提供一個通過的格式和類型來表徵文檔間的關係。如果資料庫必須與多個架構和工具進行互動,那DBRefs格式也提供表徵文檔之間的聯絡的通用語義。
手動引用
考慮如下樣本,使第一個文檔的_id欄位作為第二個文檔的引用
original_id = ObjectId()db.places.insert({ "_id": original_id, "name": "Broadway Center", "url": "bc.example.net"})db.people.insert({ "name": "Erin", "places_id": original_id, "url": "bc.example.net/Erin"})
這樣,一個查詢從people集合中返回後,就可以跟進返回結果中的places_id欄位值對places集合做第二個查詢。
手動引用是非常簡單的,解析引用也是決定於程式是否需要。
DBRefs
DBRefs約定是表徵一個文檔,而非一個特定的參考型別。DBRefs除了包含_id欄位值,還包含集合名,某些情況下還包括資料庫名。
格式如下:
$ref:欄位保持著被引用的文檔所在集合的名稱
$id:包含了被引用文檔的_id欄位值
$db:這是一個可選項。包含了被引用文檔所在資料庫的名稱,注意僅部分驅動支援$db引用。
{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
樣本,考慮一個文檔,其在creator欄位中儲存了DBRef
{ "_id" : ObjectId("5126bbf64aed4daf9e2ab771"), // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId("5126bc054aed4daf9e2ab772"), "$db" : "users" }}
注意,通常來說,使用手動引用就可以了,如果需要引用多個集合中的文檔,則考慮使用DBRefs。
MongoDB資料模型(三)