Más contenido relacionado
La actualidad más candente (20)
Similar a NoSQL-MongoDB介紹 (20)
NoSQL-MongoDB介紹
- 3. NoSQL介紹
• NoSQL是Not Only SQL。
• NoSQL的目標在於解決過去關聯式資料庫(RDBMS)在某些系統應用
環境下的不足。
• RDBMS提供強大的交易功能,但是對於過大的資料量以及每秒過多的
讀寫需求(Record per Second, rps)會浪費太多系統資源在於交易控制與
資源分配。
• 目前商業的RDBMS所提供的功能很完整但是並非每個功能模組都會
需要用到,但都需要一齊買單。
- 7. NoSQL的種類
儲存類型 NoSQL產品 特性
Document MongoDb Document儲存一般會使用類似於Json格式儲存, 如此
就可以針對某些欄位建立索引,實現RDBMS某些功能。
欄(Column) Hbase, Cassandra, Hypertable 依欄位儲存,最大的特點是方便將儲存的內容結構化,
當查詢某幾欄時有最好的I/O。
鍵值組 Redis, Tokyo Cabinet/Tokyo Tyrant, Flare 透過鍵快速檢索到值,值沒有特定格式。
物件 db4o, Versant 以物件導向語法操作資料庫。
圖形 Neo4J, FlockDB 圖形關聯的最佳化儲存。
XML Berkeley DB XML, BaseX 支援XML的內部查詢語法。(Xquery)
- 11. 交易隔離等級
交易隔離等級 描述
Read Uncommitted 幾乎沒做資料保護,容易出現髒資料讀取;其效能最高
Read Committed 只允許讀取已認可的資料,重覆讀取時有可能讀到髒資料
Read Committed Snapshot Read Committed具有Snapshot的能力
Snapshot 多版本策略,讓讀取與寫入同一筆資料可以同步進行
Repeatable 連查詢的資料也會鎖定,但允許另一個交易新增/刪除,故,有幽靈資料
Serializable 所有操作皆會鎖定,資源消耗最大,
- 19. BASE
• BASE其實是三個字的縮寫:
• Basically Available(基本可用): 盡可能滿足CAP中的A和P。
• Soft-State(軟式狀態): 資料狀態可以有一段時間不一致。
• Eventual Consistency(最終一致性): 不強調高一致性。
• BASE與ACID不同之處在於它並不強調強一致性,藉由最終一致性允
許資料在一段時間內不一致來提供可用性。
- 22. MongoDb的資料結構
• MongoDb的資料結構如下
• DataBase
• Collection => 類似RDBMS中的Table
• Document => 類似RDBMS中的Record
• Field => 類似RDBMS中的Column
• 一個DataBase可以擁有好幾個Collection;一個Collection可以有好幾筆
Document。
Document
資料庫
集合 集合
Document
- 30. MongoDb連線字串可選參數
參數 描述 範例
--shell 執行完指定的.js檔之後跑shell mongo –-shell myDb
--nodb 剛啟動時不會先連到資料庫 mongo –-nodb
--norc 剛啟動時不會先執行js檔 mongo –-norc
--port [port號] 指定連線的埠號 mongo –-port 27017
--host [主機名] 指定連線到某台主機 mongo –-host MyPC
-u 連線時的帳戶 mongo –u root
-p 連線時的密碼 mongo –u root –p P@$$w0rd
- 32. MongoDb的資料型別(1)
資料型別 描述 範例
Null 代表空值或不存在 {"x":null}
Boolean True/false {"x":true}
String 任意UTF-8的字串 {"x":"foobar"}
Symbol MongoDb Shell不支援的符號會自動轉成字串
Object Id {"x":ObjectId()}
Number 長度為4/8 byte的整數與8byte的浮點數 {"x":1}
Long Number 超過8byte的整數或浮點數會以top和bottom描述
高低位4byte的值
{"x":9223372036854776000}
- 33. MongoDb的資料型別(2)
資料型別 描述 範例
date 儲存從1970/1/1開始到現在的毫秒數 {"x": new Date()}
Regular expression 採用JavaScript的正則式語法 {"x": /foobar/i}
Code JavaScript 函數 {"x": function() { ... }}
Array 陣列 {"x": ["a","b","c"]}
Embedded document 嵌套的document {"x": {"foo","bar"}}
- 37. 一般操作指令
指令 描述
show dbs 列出連線的這個MongoDb實體內
含的所有資料庫
show
collections
列出連線的這個資料庫內含的所有
集合
Use
MyDb
切換到另一個資料庫
db.Collectio
n.drop()
刪除指定集合
- 40. MongoDb查詢的運算子
運算子 對等運算 運算子 對等運算
$gt > $lt <
$gte >= $lte <=
$all 符合所有列舉值 $exists 判斷指令欄位是否存在
$mod 運算的欄位符合指定的模數與餘數 $ne !=
$nin not in(…) $size 指定的欄位為陣列且大小符合指定值
$in in(…)
- 42. 查詢實務應用
應用 範例
OR條件 db.users.find({"$or": [{"ticket_no" : 725}, {"winner": true}]})
值區間 db.users.find({"age": {"$lt": 30, "$gt": 20}});
反閘 db.users.find({"id_num": {"$not": {"$mod" : [5,1]}})
正則式 db.users.find("name": /john/i})
陣列元素完整符合 db.food.find({"fruit": ["apple", "banana"]})
陣列元素內含指定值 db.food.find({"fruit": {"$all": ["apple", "banana"]}})
陣列元素指定筆數 db.food.findOne({"name": /^a/i},{"fruit": {"$slice":[1,5]}})
查詢內嵌Document db.people.find({"name.first": "joe", "name.last": "Schmoe"})
- 43. 游標修飾子
指令 描述 範例
count 查詢紀錄條數 db.users.find().count()
skip 指定結果集的啟始位址 db.users.find().skip(3)
limit 限制結果集的筆數 db.users.find().limit(10)
Sort 排序 db.users.find().sort({age:1,name:-1})
- 44. 群組運算
指令 描述 範例
distinct 取得指定欄位的不重覆值 db.users.distinct("name")
group 與SQL的group功能一致 db.coll.group({
key: {a: true, b: true},
cond: {active: 1},
reduce: function(obj,prev) { prev.csum +=obj.c;},
initial: {csum: 0}
});
(等同)Select a,b,sum(c) From coll Where active=1 group by a,b
- 52. MongoDb為Update提供的修飾子
修飾子 描述 範例
$set 針對欄位進行修改 db.users.update({name:'john'},{$set:{name:'john2'}})
$unset 移除某個欄位 db.users.update({name:'john'},{$unset:{age:1}})
$inc 增加/減少某數字型欄位的值 db.users.update({name:'john'},{$inc:{age:10}})
$push 增加某值到陣列型欄位中 db.user.update({name:'john'},{$push,{comment:'Hi'}})
$addToSet 增加某值到陣列且不重覆 db.user.update({name:'john'},{$addToSet:{emails:'john
@mail.com'}})
$ 位址運算子 db.user.update({name:'john'},{$set:{emails.$.subject:'hi'}
})
$pop 刪除陣列中第一/最後值 db.user.update({name:'john'},{$pop:{emails:1}})
$pull 刪除陣列某個指定值 db.user.update({name:'john'},{$pull:{emails:'tom@mail.c
om'}})
$pullAll 刪除陣列多個指定值 db.user.update({name:'john'},{$pullAll:{emails:['tom@m
ail.com','tom@mail.com']}})
- 53. 多筆更新
• MongoDb預設只會針對符合條件的第一筆Document進行修改。
• MongoDb在update的API為:
• update(條件,新值,upsert,multi);
• Upsert會依條件判斷是否有
該筆Document存在,若有則修
改其值;若無則新增一筆。
• db.users.update({name:'john'},
{$set:{name:'john'}},true,false)
• 若設定了multi,則update會更新多筆。
• db.users.update({name:'john'},
{$set:{name:'john'}},false,true)
- 67. 一次性套用權限到所有資料庫
角色 描述 角色 描述
readAnyDatabase 可讀取所有資料庫的
資料
readWriteAnyDatabase 可讀寫所有資料庫的
資料
userAdminAnyDatabase dbAdminAnyDatabase 可執行所有資料庫的
維護指令
- 70. 資料匯出參數
參數 描述 參數 描述
-h <hostname><:port> 指定匯入的主機名稱 --port MongoDb實體的埠號
-u <username> 登入帳戶 -p <password> 登入密碼
--db <dbName> 指定匯入的資料庫 -c <collection> 指定匯入的集合
--f <field1, field2,..> 指定匯入的欄位 --fieldFile <fileName> 指定額外的欄位檔名
--q <json> 資料匯出篩選條件 --csv 指定匯出格式為csv
-k 讀取replica set中的副節點
資料
-o 匯出的檔案完整路徑
--jsonArray 匯入的資料格式為json陣
列
--forceTableScan 略過_id欄位,僅掃描資料欄
位
- 72. 資料匯入參數
參數 描述 參數 描述
-h <hostname><:port> 指定匯入的主機名稱 --port MongoDb實體的埠號
-u <username> 登入帳戶 -p <password> 登入密碼
--db <dbName> 指定匯入的資料庫 -c <collection> 指定匯入的集合
--f <field1, field2,..> 指定匯入的欄位 --fieldFile <fileName> 指定額外的欄位檔名
--ignoreBlanks 值為空則忽略該欄位 --type <json/csv/tsv> 宣告匯入的資料格式
--file <filename> 匯入的檔案名稱 --drop 匯入前清空集合資料
--headerline 首欄作為欄位名稱 --upsert 僅匯入集合沒有的資料
--upsertFields <field1,..> upsert比較的欄位
(預設僅比較_id欄位)
--stopOnError 當有錯誤發生時停止繼
續匯入
--jsonArray 匯入的資料格式為json陣列
- 75. 資料備份參數
參數 描述 參數 描述
-h <hostname><:port> 指定匯入的主機名稱 --port MongoDb實體的埠號
-u <username> 登入帳戶 -p <password> 登入密碼
--db <dbName> 指定匯入的資料庫 -c <collection> 指定匯入的集合
--f <field1, field2,..> 指定匯入的欄位 --fieldFile <fileName> 指定額外的欄位檔名
--q <json> 資料匯出篩選條件 -o 匯出的檔案完整路徑
--repair 讀取replica set中的副
節點資料
--forceTableScan 略過_id欄位,僅掃描資
料欄位
- 78. 資料還原參數
參數 描述 參數 描述
-h <hostname><:port> 指定匯入的主機名稱 --port MongoDb實體的埠號
-u <username> 登入帳戶 -p <password> 登入密碼
--db <dbName> 指定匯入的資料庫 -c <collection> 指定匯入的集合
-objcheck 驗證匯入的每筆資料 --noobjcheck 不驗證匯入的資料
--filter ‘<json>’ 篩選匯入的資料 --drop 匯入前先清除資料庫資料
--keepIndexVersion 避免匯入時索引異動 --noOptionsRestore 避免匯入時組態的異動
--noIndexRestore 保留原資料庫索引
- 91. rs.Add
屬性 描述
_id 從0開始的序號
host 資料格式為[主機名稱]<:Port>
arbiterOnly True/False,標明此成員是否為仲裁者
buildIndex True/False,標明此成員是否要建立索引
hidden True/False,標明此成員不接受讀取請求
Priority 1~100,指定當Primary故障後,此成員替補的優先權
tag 資料格式為Document,描述此成員的相關資訊;常用於getLastError
SlaveDelay 0~N,設定此成員的資料落後Primary幾秒
Votes 0~1,控制當投票時,該成員的選票權重
- 97. ReplicaSet的節點狀態
狀態 是否允許投票 描述
StartUp 解譯ReplicaSet的組態資料
Primary 主節點;唯一可接受寫入請求的節點
Secondary 副節點,可接受讀取請求,在主節點發生錯誤時可以替代
Recovering 節點正處於自我確認或從完成狀態移轉成RollBack狀態
Fatal 此節點遭遇無法修復的錯誤
Startup2 即將成為副節點
Unknown 此節點曾存在Set中,但發生不明錯誤
Arbiter 不會複寫主節點資料,僅參與投票
Down 此節點曾存在Set中,但目前正下線中
RollBack 節點正處於RollBack狀態
Shunned 此節點曾在ReplicaSet,但現在不在了
- 98. 複寫相關API(1)
函數 描述 範例
initiate 初始化整個ReplicaSet rs.initiate()
conf 組態整個ReplicaSet的成員設定
reconf 異動過ReplicaSet後,重新套用組態 var cfg = rs.conf();
cfg.members[0].priority = 2;
rs.reconfig(cfg);
add 添加一個新成員到ReplicaSet rs.add({_id:0, host: MyCom:27001})
addArb 添加一個仲裁者進ReplicaSet中 rs.addArb(“MyComp:27001”)
status 查看整個ReplicaSet的當前組態 rs.status()
remove 將某個成員從ReplicaSet中移除 rs.remove(“MyComp:27001”)
- 99. 複寫相關API(2)
函數 描述 範例
stepDown Primary節點自動降級為Secondary rs.stepDown()
freeze 成員在指定的時間內,若Primary故障則該成員無
法成為Primary
rs.freeze(300)
slaveOk 該成員為Secondary且允許被讀取其資料 rs.slaveOk()
syncFrom Secondary成員指定資料複寫的來源對象 rs.syncFrom(“MyComp:27001”)
isMaster 詢問當前連線的實體是否為Primary db.isMaster()