與傳統(tǒng)的關(guān)系數(shù)據(jù)庫不同,MongoDB是一種面向文檔的數(shù)據(jù)庫。本書這一版共分為6個部分,涵蓋開發(fā)、管理以及部署等各個方面。這一版對TTL和聚合管道等新特性進(jìn)行了講解,還增加了配置MongoDB的章節(jié),涵蓋面向文檔的存儲方式及利用MongoDB的無模式數(shù)據(jù)模型處理文檔、集合和多個數(shù)據(jù)庫,以及監(jiān)控、安全性和身份驗證、備份和修復(fù)、水平擴展MongoDB數(shù)據(jù)庫等多方面的內(nèi)容。
香農(nóng)·布拉德肖(Shannon Bradshaw)是MongoDB公司培訓(xùn)部門副總裁,負(fù)責(zé)管理MongoDB專業(yè)認(rèn)證項目提供的培訓(xùn)產(chǎn)品。 約恩·布拉齊爾(Eoin Brazil)是MongoDB公司高級課程工程師,致力于開發(fā)與MongoDB相關(guān)的在線培訓(xùn)產(chǎn)品。 克里斯蒂娜·霍多羅夫(Kristina Chodorow)是軟件工程師,曾深度參與MongoDB的內(nèi)核開發(fā)工作。她領(lǐng)導(dǎo)了MongoDB副本集功能的開發(fā)并編寫了PHP和Perl的驅(qū)動程序。 【譯者介紹】 牟天壘,架構(gòu)師,MongoDB官方認(rèn)證雙證持有者,MongoDB官方中文社區(qū)核心成員,MongoDB生態(tài)工具Tapdata創(chuàng)始工程師,致力于實時數(shù)據(jù)服務(wù)理念的實現(xiàn)。 王明輝,本科就讀于同濟大學(xué),從事全棧開發(fā)多年,參與過數(shù)個創(chuàng)業(yè)項目,也對開源社區(qū)有所貢獻(xiàn),現(xiàn)就職于微軟(亞洲)互聯(lián)網(wǎng)工程院。
前言 xvii
第 一部分 MongoDB入門
第 1 章 MongoDB簡介 3
1.1 易于使用 3
1.2 易于擴展 3
1.3 功能豐富 4
1.4 性能卓越 5
1.5 設(shè)計理念 5
第 2 章 入門指南 6
2.1 文檔 6
2.2 集合 7
2.2.1 動態(tài)模式 7
2.2.2 命名 8
2.3 數(shù)據(jù)庫 8
2.4 啟動MongoDB 9
2.5 MongoDB shell介紹 10
2.5.1 運行shell 10
2.5.2 MongoDB客戶端 11
2.5.3 shell中的基本操作 12
2.6 數(shù)據(jù)類型 14
2.6.1 基本數(shù)據(jù)類型 14
2.6.2 日期 15
2.6.3 數(shù)組 16
2.6.4 內(nèi)嵌文檔 16
2.6.5 ObjectId和_id 17
2.7 使用MongoDB shell 18
2.7.1 shell使用技巧 19
2.7.2 使用shell執(zhí)行腳本 19
2.7.3 創(chuàng)建.mongorc.js文件 21
2.7.4 定制shell提示信息 22
2.7.5 編輯復(fù)雜變量 23
2.7.6 不便使用的集合名稱 23
第 3 章 創(chuàng)建、更新和刪除文檔 25
3.1 插入文檔 25
3.1.1 insertMany 25
3.1.2 插入校驗 28
3.1.3 插入 28
3.2 刪除文檔 28
3.3 更新文檔 30
3.3.1 文檔替換 30
3.3.2 使用更新運算符 31
3.3.3 upsert 40
3.3.4 更新多個文檔 42
3.3.5 返回被更新的文檔 42
第 4 章 查詢 45
4.1 find簡介 45
4.1.1 指定要返回的鍵 46
4.1.2 限制 46
4.2 查詢條件 47
4.2.1 查詢條件 47
4.2.2 OR查詢 47
4.2.3 $not 48
4.3 特定類型的查詢 48
4.3.1 null 49
4.3.2 正則表達(dá)式 49
4.3.3 查詢數(shù)組 50
4.3.4 查詢內(nèi)嵌文檔 54
4.4 $where查詢 55
4.5 游標(biāo) 56
4.5.1 limit、skip和sort 57
4.5.2 避免略過大量結(jié)果 58
4.5.3 游標(biāo)生命周期 59
第二部分 設(shè)計應(yīng)用程序
第 5 章 索引 63
5.1 索引簡介 63
5.1.1 創(chuàng)建索引 65
5.1.2 復(fù)合索引簡介 68
5.1.3 MongoDB如何選擇索引 71
5.1.4 使用復(fù)合索引 72
5.1.5 $運算符如何使用索引 88
5.1.6 索引對象和數(shù)組 97
5.1.7 索引基數(shù) 99
5.2 explain輸出 99
5.3 何時不使用索引 106
5.4 索引類型 107
5.4.1 索引 107
5.4.2 部分索引 109
5.5 索引管理 110
5.5.1 標(biāo)識索引 111
5.5.2 修改索引 111
第 6 章 特殊的索引和集合類型 112
6.1 地理空間索引 112
6.1.1 地理空間查詢的類型 113
6.1.2 使用地理空間索引 114
6.1.3 復(fù)合地理空間索引 120
6.1.4 2d索引 121
6.2 全文搜索索引 123
6.2.1 創(chuàng)建文本索引 123
6.2.2 文本查詢 124
6.2.3 優(yōu)化全文本搜索 126
6.2.4 在其他語言中搜索 126
6.3 固定集合 127
6.3.1 創(chuàng)建固定集合 129
6.3.2 可追加游標(biāo) 129
6.4 TTL索引 130
6.5 使用GridFS存儲文件 130
6.5.1 GridFS入門:mongofiles 131
6.5.2 在MongoDB驅(qū)動程序中使用GridFS 131
6.5.3 GridFS的底層機制 132
第 7 章 聚合框架 134
7.1 管道、階段和可調(diào)參數(shù) 134
7.2 階段入門:常見操作 136
7.3 表達(dá)式 140
7.4 $project 140
7.5 $unwind 145
7.6 數(shù)組表達(dá)式 151
7.7 累加器 155
7.8 分組簡介 57
7.8.1 分組階段中的_id字段 161
7.8.2 分組與投射 163
7.9 將聚合管道結(jié)果寫入集合中 166
第 8 章 事務(wù) 167
8.1 事務(wù)簡介 167
8.2 如何使用事務(wù) 168
8.3 對應(yīng)用程序的事務(wù)限制進(jìn)行調(diào)優(yōu) 171
第 9 章 應(yīng)用程序設(shè)計 173
9.1 模式設(shè)計注意事項 173
9.2 范式化與反范式化 176
9.2.1 數(shù)據(jù)表示的示例 176
9.2.2 基數(shù) 180
9.2.3 好友、粉絲以及其他麻煩事項 180
9.3 優(yōu)化數(shù)據(jù)操作 182
9.4 數(shù)據(jù)庫和集合的設(shè)計 183
9.5 一致性管理 183
9.6 模式遷移 184
9.7 模式管理 185
9.8 不適合使用MongoDB的場景 185
第三部分 復(fù)制
第 10 章 創(chuàng)建副本集 189
10.1 復(fù)制簡介 189
10.2 建立副本集(一) 190
10.3 網(wǎng)絡(luò)注意事項 191
10.4 安全注意事項 191
10.5 建立副本集(二) 191
10.6 觀察副本集 194
10.7 更改副本集配置 199
10.8 如何設(shè)計副本集 201
10.9 成員配置選項 203
10.9.1 優(yōu)先級 204
10.9.2 隱藏成員 204
10.9.3 選舉仲裁者 205
10.9.4 創(chuàng)建索引 206
第 11 章 副本集的組成 207
11.1 同步 207
11.1.1 初始化同步 209
11.1.2 復(fù)制 210
11.1.3 處理過時數(shù)據(jù) 210
11.2 心跳 210
11.3 選舉 212
11.4 回滾 212
第 12 章 從應(yīng)用程序連接副本集 216
12.1 客戶端到副本集的連接行為 216
12.2 在寫入時等待復(fù)制 218
12.3 自定義復(fù)制保證規(guī)則 219
12.3.1 保證復(fù)制到每個數(shù)據(jù)中心的一臺服務(wù)器上 219
12.3.2 保證寫操作被復(fù)制到大多數(shù)非隱藏節(jié)點 220
12.3.3 創(chuàng)建其他保證規(guī)則 221
12.4 將讀請求發(fā)送到從節(jié)點 221
12.4.1 一致性考慮 222
12.4.2 負(fù)載考慮 222
12.4.3 由從節(jié)點讀取數(shù)據(jù)的場景 223
第 13 章 管理 224
13.1 以單機模式啟動成員 224
13.2 副本集配置 225
13.2.1 創(chuàng)建副本集 225
13.2.2 更改副本集成員 225
13.2.3 創(chuàng)建比較大的副本集 226
13.2.4 強制重新配置 226
13.3 控制成員狀態(tài) 227
13.3.1 把主節(jié)點變?yōu)閺墓?jié)點 227
13.3.2 阻止選舉 227
13.4 監(jiān)控復(fù)制 228
13.4.1 獲取狀態(tài) 228
13.4.2 可視化復(fù)制圖譜 231
13.4.3 復(fù)制循環(huán) 232
13.4.4 禁用復(fù)制鏈 232
13.4.5 計算延遲 233
13.4.6 調(diào)整oplog大小 234
13.4.7 創(chuàng)建索引 234
13.4.8 在預(yù)算有限的情況下進(jìn)行復(fù)制 235
第四部分 分片
第 14 章 分片簡介 239
14.1 什么是分片 239
14.2 理解集群組件 240
14.3 在單機集群上進(jìn)行分片 241
第 15 章 配置分片 250
15.1 何時分片 250
15.2 啟動服務(wù)器 251
15.2.1 配置服務(wù)器 251
15.2.2 mongos進(jìn)程 252
15.2.3 將副本集轉(zhuǎn)換為分片 252
15.2.4 增加集群容量 256
15.2.5 數(shù)據(jù)分片 256
15.3 MongoDB如何追蹤集群數(shù)據(jù) 256
15.3.1 塊范圍 257
15.3.2 拆分塊 259
15.4 均衡器 261
15.5 排序規(guī)則 261
15.6 變更流 261
第 16 章 選擇片鍵 263
16.1 評估使用情況 263
16.2 描繪分發(fā)情況 264
16.2.1 升序片鍵 264
16.2.2 隨機分發(fā)的片鍵 266
16.2.3 基于位置的片鍵 267
16.3 片鍵策略 268
16.3.1 哈希片鍵 268
16.3.2 GridFS的哈希片鍵 270
16.3.3 消防水管策略 270
16.3.4 多熱點 271
16.4 片鍵規(guī)則和指導(dǎo)方針 273
16.4.1 片鍵的限制 273
16.4.2 片鍵的基數(shù) 273
16.5 控制數(shù)據(jù)分發(fā) 273
16.5.1 對多個數(shù)據(jù)庫和集合使用一個集群 273
16.5.2 手動分片 275
第 17 章 分片管理 276
17.1 查看當(dāng)前狀態(tài) 276
17.1.1 使用sh.status()查看摘要信息 276
17.1.2 查看配置信息 278
17.2 跟蹤網(wǎng)絡(luò)連接 283
17.2.1 獲取連接統(tǒng)計 284
17.2.2 限制連接數(shù)量 289
17.3 服務(wù)器管理 290
17.3.1 添加服務(wù)器 291
17.3.2 修改分片中的服務(wù)器 291
17.3.3 刪除分片 291
17.4 數(shù)據(jù)均衡 294
17.4.1 均衡器 294
17.4.2 修改塊的大小 295
17.4.3 移動塊 296
17.4.4 超大塊 298
17.4.5 刷新配置 300
第五部分 應(yīng)用程序管理
第 18 章 了解應(yīng)用程序的動態(tài) 303
18.1 查看當(dāng)前操作 303
18.1.1 尋找有問題的操作 306
18.1.2 終止操作 306
18.1.3 假象 307
18.1.4 防止幻象操作 307
18.2 使用系統(tǒng)分析器 307
18.3 計算大小 310
18.3.1 文檔 310
18.3.2 集合 311
18.3.3 數(shù)據(jù)庫 315
18.4 使用mongotop和mongostat 316
第 19 章 MongoDB安全介紹 318
19.1 MongoDB的身份驗證和授權(quán) 318
19.1.1 身份驗證機制 318
19.1.2 授權(quán) 319
19.1.3 使用x.509證書對成員和客戶端進(jìn)行身份驗證 320
19.2 MongoDB的認(rèn)證和傳輸層加密教程 323
19.2.1 建立CA 323
19.2.2 生成并簽名成員證書 327
19.2.3 生成并簽名客戶端證書 328
19.2.4 在不啟用身份驗證和授權(quán)的情況下啟動副本集 328
19.2.5 創(chuàng)建admin用戶 329
19.2.6 啟用身份驗證和授權(quán)并重新啟動副本集 330
第 20 章 持久性 332
20.1 使用日志機制的成員級別持久性 332
20.2 使用寫關(guān)注的集群級別持久性 333
20.2.1 writeConcern的w和wtimeout選項 334
20.2.2 writeConcern的j(日志)選項 334
20.3 使用讀關(guān)注的集群級別持久性 335
20.4 使用寫關(guān)注的事務(wù)持久性 335
20.5 MongoDB不能保證什么 336
20.6 檢查數(shù)據(jù)損壞 336
第六部分 服務(wù)器端管理
第 21 章 在生產(chǎn)環(huán)境中設(shè)置MongoDB 341
21.1 從命令行啟動 341
21.2 停止MongoDB 345
21.3 安全性 346
21.3.1 數(shù)據(jù)加密 347
21.3.2 SSL連接 347
21.4 日志 348
第 22 章 監(jiān)控MongoDB 349
22.1 監(jiān)控內(nèi)存使用情況 349
22.1.1 計算機內(nèi)存簡介 349
22.1.2 跟蹤內(nèi)存使用情況 350
22.1.3 跟蹤缺頁錯誤 351
22.1.4 I/O 等待 352
22.2 計算工作集的大小 352
22.3 跟蹤性能情況 354
22.4 跟蹤剩余空間 355
22.5 監(jiān)控復(fù)制情況 356
第 23 章 備份 359
23.1 備份方法 359
23.2 對服務(wù)器進(jìn)行備份 360
23.2.1 文件系統(tǒng)快照 360
23.2.2 復(fù)制數(shù)據(jù)文件 363
23.2.3 使用mongodump 364
23.3 副本集的特殊注意事項 366
23.4 分片集群的特殊注意事項 366
23.4.1 備份和恢復(fù)整個集群 367
23.4.2 備份和恢復(fù)單個分片 367
第 24 章 部署MongoDB 368
24.1 系統(tǒng)設(shè)計 368
24.1.1 選擇存儲介質(zhì) 368
24.1.2 推薦的RAID配置 369
24.1.3 CPU 370
24.1.4 操作系統(tǒng) 370
24.1.5 交換空間 370
21.1.6 文件系統(tǒng) 371
24.2 虛擬化 371
24.2.1 內(nèi)存過度分配 371
24.2.2 神秘的內(nèi)存 371
24.2.3 處理網(wǎng)絡(luò)磁盤的I/O 問題 372
24.2.4 使用非網(wǎng)絡(luò)磁盤 373
24.3 配置系統(tǒng)設(shè)置 373
24.3.1 關(guān)閉NUMA 373
24.3.2 設(shè)置預(yù)讀 375
24.3.3 禁用透明大內(nèi)存頁(THP) 375
24.3.4 選擇磁盤調(diào)度算法 376
24.3.5 禁用訪問時間跟蹤 376
24.3.6 修改限制 377
24.4 網(wǎng)絡(luò)配置 378
24.5 系統(tǒng)管理 379
24.5.1 時鐘同步 379
24.5.2 OOM killer 379
24.5.3 關(guān)閉定期任務(wù) 379
附錄A 安裝MongoDB 380
附錄B 深入MongoDB 384