標籤:style blog http color io os 使用 ar java
Nosql DB
這是一個非關係型資料庫。 通常我們的資料庫有三類: 關係型資料庫(RDBMS),線上分析處理資料庫(OLAP),和菲關係型資料庫(NoSql)。
MongoDB屬於第三種,而且是一種基於文檔的(document oriented)資料庫。
優劣勢
優勢: 查詢效能,在都沒有建立索引的時候,明顯快於MySql。 都建立了索引後,不慢於MySql。
劣勢: 不支援事物。因此如果對於事物要求很高的情形,不適用這個資料庫。
概念&文法 概念
collection:集合,等於關係型資料庫中的table。
dcoument:文檔對象,等同於關係型資料庫table中的一行記錄。
field: 索引值對,等同於關係型資料庫中table的一個column
database:這個沒啥區別。
資料在MongoDB中是以BSON的格式儲存的,所謂BSON就是binary json, 也就是二進位的json資料。
文法
屬性:javascript文法。
顯示資料庫: show dbs
使用資料庫: use your_db (備忘:這樣子就好了,your_db不存在,則“建立”一個出來,不會報錯,事實是:直到儲存docuemnt對象時才建立collection和資料庫)
插入記錄: your_db.your_collection.insert(json運算式) (備忘:可以將關聯的對象通過json運算式儲存在一個document裡面---2中的標註3所示,這個跟關係型資料庫不同)
更新記錄: your_db.your_collection.update(json運算式)
your_db.your_collection.save(json運算式) : 實際上是插入和更新操作的合并,記錄不存在則insert,存在則update。
以上指令示範如所示:
圖1
查詢記錄:your_db.your_collection.find({索引值對},{需要顯示/隱藏的欄位的索引值對})/findOne({索引值對},{需要顯示/隱藏的欄位的索引值對})
注意:a) find返回的是一個cursor對象(遊標對象), 而findOne返回的是一個document(一條記錄)。
find的結果可以用forEach(printjson)格式化,如(圖中標註1)所示:
圖2
b).findOne,對於有多條記錄,則只返回第一條記錄(最舊的那條).
c). 第二個參數:{需要顯示/隱藏的欄位的索引值對}, 要麼設為白名單,即允許顯示哪些欄位 ,如{ ‘field1‘:1, ‘field2‘:1,...},
要麼設定為黑名單,即指定哪些欄位不顯示,如 {‘field1‘:0 , ‘field2‘:0,....}
不能混用,例如 {‘field1‘:1, ‘field2‘:0},這個是不受支援的。
但對於_id欄位例外,這個欄位可以混用。
d). 由於一個document中可能儲存多級對象,引用子物件可以像js中一樣用點號(.)。
例如,已知,user對應的document中儲存了name欄位,這個欄位是一個json對象(另外一張表--在關係型資料庫中),如下
{ "_id":ObjectId("a2349723424adfa14"), "name":{"first":"John","last":"Smith"} ....}
那麼,如果要查詢名為john的人,可以這樣寫js
your_db.user.find({‘name.first‘:‘John‘})
e). 範式(normalization)與反範式(de-normalization)
通常把所有的資料存放區在一個document裡面,這個叫做de-normalization,即用冗餘換取讀取的效能。這通常使用於讀資料比較多的情形,比如cms系統。
如果寫資料會比較多,最好normalization一下,即通過第一,第二,第三範式將資料表(collection)重新設計。
mongodb是支援normalization的,通過_id實現(圖2中標註2),_id採用了一個特殊的演算法,考慮到機器,資料庫,collection,時間等因素,將其綜合編碼到_id中,以保證資料的唯一性。
在normalization後的資料庫中,通過link(連結),指向其他docuemt。
例如,book對象可以有author對象的連結,如下:
{"_id":ObjectId("book_id1123132"),
"name":"MongoDB 30分鐘精通",
"author_id": ObjectId("author_id_say_tommy"),
...
}
author document對象:
{
"_id": ObjectId("author_id_say_tommy"),
"name":"Tommy",
...
}
這個就是分離了冗餘資料,從而有利於update資料操作。
關於MongoDB(一)