當我們向Mongodb寫資料,它們永遠是以文檔格式插入的。文檔是一種資料結構,類似於JSON,Python 字典,和 Ruby的散列。在這裡,我們多聊聊面向文檔和怎樣向Mongodb插入資料。
面向文檔
面向文檔的資料庫儲存“文檔”,但是這裡的文檔指的是結構化的文檔 - 該術語可能來自於"XML 文檔"。其他結構化的資料,如JSON,甚至在很多語言中的內嵌字典,都有著相似的性質。
儲存在Mongodb中的文檔是類JSON的。JSON是一種儲存程式中對象風格資料的很好的方法,一定意義上講它是語言無關並且是基於一些標準的。
為了更加高效,Mongodb使用了一種稱為BSON的格式,以二進位的形式呈現資料。BSON在掃描指定欄位時比JSON要快。同時BSON增加了一些額外的類型,如日期類型和位元組數群組類型。BSON可以很容易映射為JSON或者從JSON映射,並且在很多程式設計語言中可以映射為多種資料結構。
用戶端驅動將資料序列化為BSON,然後通過線路傳輸資料到資料庫。資料以BSON格式儲存到硬碟。這樣的話,在檢索資料時,資料庫只需要做很少量的轉換就可以將資料發送出,表現出很高的效率。用戶端驅動將收到的BSON對象還原序列化為自己本地語言的格式。
JSON
舉例來說,下面的“文檔”就可以儲存在Mongodb中:
{ author: 'joe',
created : new Date('03/28/2009'),
title : 'Yet another blog post',
text : 'Here is the text...',
tags : [ 'example', 'joe' ],
comments : [ { author: 'jim', comment: 'I disagree' },
{ author: 'nancy', comment: 'Good post' }
]
}
這個文檔是一個部落格文章,因此我們可以使用shell將它儲存在一個“posts”集合中:
> doc = { author : 'joe', created : new Date('03/28/2009'), ... }
> db.posts.insert(doc);
Mongodb理解BSON對象的內部結構--並不僅僅是可以儲存它們,mongodb可以對內部欄位進行查詢並且可以對這些欄位建立索引。例如這個查詢:
> db.posts.find( { "comments.author" : "jim" } )
是可能的,它的意思是“查詢所有的包含一條作者為jiim的文章的部落格文章”。
Mongo友好 模式
mongo可以通過很多方式來使用,第一直覺就是它和使用關係型資料庫非常類似。mongo就是設計用來處理包含豐富內容對象的,並且可以表現的很好。
儲存樣本
如果你正在建立一個網上商店,使用的是關係型資料庫,你的資料結構可能是類似於:
item
title
price
sku
item_features
sku
feature_name
feature_value
你可能會這樣組織資料庫結構因為不同的item有著不同的feature,並且你不希望所有可能的feature都儲存到一張表中。你也可以在mongo實現同樣的資料結構,但是在mongo中可能會更簡便:
item : {
"title" : <title> ,
"price" : <price> ,
"sku" : <sku> ,
"features" : {
"optical zoom" : <value> ,
...
}
}
這樣做非常棒:
- 你可以一次查詢到整個item
- 某個item的所有資料存放區在磁碟上的同一塊地區,這樣一次磁碟尋找就可以搞定了
現在,乍一看似乎有一些問題,但其實我們都已經考慮到了。
- 你可能需要插入或者更新一個單獨的feature。可以這樣來操作:
- 增加一個feature需要在磁碟上面移動整個item嗎?不需要。mongo為每一個對象預留了一些空間來適應它的增長。這也會預防引起索引的改變。