与传统的关系数据库不同,MongoDB是一种面向文档的数据库。本书这一版共分为6个部分,涵盖开发、管理以及部署等各个方面。这一版对TTL和聚合管道等新特性进行了讲解,还增加了配置MongoDB的章节,涵盖面向文档的存储方式及利用MongoDB的无模式数据模型处理文档、集合和多个数据库,以及监控、安全性和身份验证、备份和修复、水平扩展MongoDB数据库等多方面的内容。
香农·布拉德肖(Shannon Bradshaw)是MongoDB公司培训部门副总裁,负责管理MongoDB专业认证项目提供的培训产品。 约恩·布拉齐尔(Eoin Brazil)是MongoDB公司高级课程工程师,致力于开发与MongoDB相关的在线培训产品。 克里斯蒂娜·霍多罗夫(Kristina Chodorow)是软件工程师,曾深度参与MongoDB的内核开发工作。她领导了MongoDB副本集功能的开发并编写了PHP和Perl的驱动程序。 【译者介绍】 牟天垒,架构师,MongoDB官方认证双证持有者,MongoDB官方中文社区核心成员,MongoDB生态工具Tapdata创始工程师,致力于实时数据服务理念的实现。 王明辉,本科就读于同济大学,从事全栈开发多年,参与过数个创业项目,也对开源社区有所贡献,现就职于微软(亚洲)互联网工程院。
前言 xvii
第 一部分 MongoDB入门
第 1 章 MongoDB简介 3
1.1 易于使用 3
1.2 易于扩展 3
1.3 功能丰富 4
1.4 性能卓越 5
1.5 设计理念 5
第 2 章 入门指南 6
2.1 文档 6
2.2 集合 7
2.2.1 动态模式 7
2.2.2 命名 8
2.3 数据库 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 数据类型 14
2.6.1 基本数据类型 14
2.6.2 日期 15
2.6.3 数组 16
2.6.4 内嵌文档 16
2.6.5 ObjectId和_id 17
2.7 使用MongoDB shell 18
2.7.1 shell使用技巧 19
2.7.2 使用shell执行脚本 19
2.7.3 创建.mongorc.js文件 21
2.7.4 定制shell提示信息 22
2.7.5 编辑复杂变量 23
2.7.6 不便使用的集合名称 23
第 3 章 创建、更新和删除文档 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 正则表达式 49
4.3.3 查询数组 50
4.3.4 查询内嵌文档 54
4.4 $where查询 55
4.5 游标 56
4.5.1 limit、skip和sort 57
4.5.2 避免略过大量结果 58
4.5.3 游标生命周期 59
第二部分 设计应用程序
第 5 章 索引 63
5.1 索引简介 63
5.1.1 创建索引 65
5.1.2 复合索引简介 68
5.1.3 MongoDB如何选择索引 71
5.1.4 使用复合索引 72
5.1.5 $运算符如何使用索引 88
5.1.6 索引对象和数组 97
5.1.7 索引基数 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 标识索引 111
5.5.2 修改索引 111
第 6 章 特殊的索引和集合类型 112
6.1 地理空间索引 112
6.1.1 地理空间查询的类型 113
6.1.2 使用地理空间索引 114
6.1.3 复合地理空间索引 120
6.1.4 2d索引 121
6.2 全文搜索索引 123
6.2.1 创建文本索引 123
6.2.2 文本查询 124
6.2.3 优化全文本搜索 126
6.2.4 在其他语言中搜索 126
6.3 固定集合 127
6.3.1 创建固定集合 129
6.3.2 可追加游标 129
6.4 TTL索引 130
6.5 使用GridFS存储文件 130
6.5.1 GridFS入门:mongofiles 131
6.5.2 在MongoDB驱动程序中使用GridFS 131
6.5.3 GridFS的底层机制 132
第 7 章 聚合框架 134
7.1 管道、阶段和可调参数 134
7.2 阶段入门:常见操作 136
7.3 表达式 140
7.4 $project 140
7.5 $unwind 145
7.6 数组表达式 151
7.7 累加器 155
7.8 分组简介 57
7.8.1 分组阶段中的_id字段 161
7.8.2 分组与投射 163
7.9 将聚合管道结果写入集合中 166
第 8 章 事务 167
8.1 事务简介 167
8.2 如何使用事务 168
8.3 对应用程序的事务限制进行调优 171
第 9 章 应用程序设计 173
9.1 模式设计注意事项 173
9.2 范式化与反范式化 176
9.2.1 数据表示的示例 176
9.2.2 基数 180
9.2.3 好友、粉丝以及其他麻烦事项 180
9.3 优化数据操作 182
9.4 数据库和集合的设计 183
9.5 一致性管理 183
9.6 模式迁移 184
9.7 模式管理 185
9.8 不适合使用MongoDB的场景 185
第三部分 复制
第 10 章 创建副本集 189
10.1 复制简介 189
10.2 建立副本集(一) 190
10.3 网络注意事项 191
10.4 安全注意事项 191
10.5 建立副本集(二) 191
10.6 观察副本集 194
10.7 更改副本集配置 199
10.8 如何设计副本集 201
10.9 成员配置选项 203
10.9.1 优先级 204
10.9.2 隐藏成员 204
10.9.3 选举仲裁者 205
10.9.4 创建索引 206
第 11 章 副本集的组成 207
11.1 同步 207
11.1.1 初始化同步 209
11.1.2 复制 210
11.1.3 处理过时数据 210
11.2 心跳 210
11.3 选举 212
11.4 回滚 212
第 12 章 从应用程序连接副本集 216
12.1 客户端到副本集的连接行为 216
12.2 在写入时等待复制 218
12.3 自定义复制保证规则 219
12.3.1 保证复制到每个数据中心的一台服务器上 219
12.3.2 保证写操作被复制到大多数非隐藏节点 220
12.3.3 创建其他保证规则 221
12.4 将读请求发送到从节点 221
12.4.1 一致性考虑 222
12.4.2 负载考虑 222
12.4.3 由从节点读取数据的场景 223
第 13 章 管理 224
13.1 以单机模式启动成员 224
13.2 副本集配置 225
13.2.1 创建副本集 225
13.2.2 更改副本集成员 225
13.2.3 创建比较大的副本集 226
13.2.4 强制重新配置 226
13.3 控制成员状态 227
13.3.1 把主节点变为从节点 227
13.3.2 阻止选举 227
13.4 监控复制 228
13.4.1 获取状态 228
13.4.2 可视化复制图谱 231
13.4.3 复制循环 232
13.4.4 禁用复制链 232
13.4.5 计算延迟 233
13.4.6 调整oplog大小 234
13.4.7 创建索引 234
13.4.8 在预算有限的情况下进行复制 235
第四部分 分片
第 14 章 分片简介 239
14.1 什么是分片 239
14.2 理解集群组件 240
14.3 在单机集群上进行分片 241
第 15 章 配置分片 250
15.1 何时分片 250
15.2 启动服务器 251
15.2.1 配置服务器 251
15.2.2 mongos进程 252
15.2.3 将副本集转换为分片 252
15.2.4 增加集群容量 256
15.2.5 数据分片 256
15.3 MongoDB如何追踪集群数据 256
15.3.1 块范围 257
15.3.2 拆分块 259
15.4 均衡器 261
15.5 排序规则 261
15.6 变更流 261
第 16 章 选择片键 263
16.1 评估使用情况 263
16.2 描绘分发情况 264
16.2.1 升序片键 264
16.2.2 随机分发的片键 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 片键规则和指导方针 273
16.4.1 片键的限制 273
16.4.2 片键的基数 273
16.5 控制数据分发 273
16.5.1 对多个数据库和集合使用一个集群 273
16.5.2 手动分片 275
第 17 章 分片管理 276
17.1 查看当前状态 276
17.1.1 使用sh.status()查看摘要信息 276
17.1.2 查看配置信息 278
17.2 跟踪网络连接 283
17.2.1 获取连接统计 284
17.2.2 限制连接数量 289
17.3 服务器管理 290
17.3.1 添加服务器 291
17.3.2 修改分片中的服务器 291
17.3.3 删除分片 291
17.4 数据均衡 294
17.4.1 均衡器 294
17.4.2 修改块的大小 295
17.4.3 移动块 296
17.4.4 超大块 298
17.4.5 刷新配置 300
第五部分 应用程序管理
第 18 章 了解应用程序的动态 303
18.1 查看当前操作 303
18.1.1 寻找有问题的操作 306
18.1.2 终止操作 306
18.1.3 假象 307
18.1.4 防止幻象操作 307
18.2 使用系统分析器 307
18.3 计算大小 310
18.3.1 文档 310
18.3.2 集合 311
18.3.3 数据库 315
18.4 使用mongotop和mongostat 316
第 19 章 MongoDB安全介绍 318
19.1 MongoDB的身份验证和授权 318
19.1.1 身份验证机制 318
19.1.2 授权 319
19.1.3 使用x.509证书对成员和客户端进行身份验证 320
19.2 MongoDB的认证和传输层加密教程 323
19.2.1 建立CA 323
19.2.2 生成并签名成员证书 327
19.2.3 生成并签名客户端证书 328
19.2.4 在不启用身份验证和授权的情况下启动副本集 328
19.2.5 创建admin用户 329
19.2.6 启用身份验证和授权并重新启动副本集 330
第 20 章 持久性 332
20.1 使用日志机制的成员级别持久性 332
20.2 使用写关注的集群级别持久性 333
20.2.1 writeConcern的w和wtimeout选项 334
20.2.2 writeConcern的j(日志)选项 334
20.3 使用读关注的集群级别持久性 335
20.4 使用写关注的事务持久性 335
20.5 MongoDB不能保证什么 336
20.6 检查数据损坏 336
第六部分 服务器端管理
第 21 章 在生产环境中设置MongoDB 341
21.1 从命令行启动 341
21.2 停止MongoDB 345
21.3 安全性 346
21.3.1 数据加密 347
21.3.2 SSL连接 347
21.4 日志 348
第 22 章 监控MongoDB 349
22.1 监控内存使用情况 349
22.1.1 计算机内存简介 349
22.1.2 跟踪内存使用情况 350
22.1.3 跟踪缺页错误 351
22.1.4 I/O 等待 352
22.2 计算工作集的大小 352
22.3 跟踪性能情况 354
22.4 跟踪剩余空间 355
22.5 监控复制情况 356
第 23 章 备份 359
23.1 备份方法 359
23.2 对服务器进行备份 360
23.2.1 文件系统快照 360
23.2.2 复制数据文件 363
23.2.3 使用mongodump 364
23.3 副本集的特殊注意事项 366
23.4 分片集群的特殊注意事项 366
23.4.1 备份和恢复整个集群 367
23.4.2 备份和恢复单个分片 367
第 24 章 部署MongoDB 368
24.1 系统设计 368
24.1.1 选择存储介质 368
24.1.2 推荐的RAID配置 369
24.1.3 CPU 370
24.1.4 操作系统 370
24.1.5 交换空间 370
21.1.6 文件系统 371
24.2 虚拟化 371
24.2.1 内存过度分配 371
24.2.2 神秘的内存 371
24.2.3 处理网络磁盘的I/O 问题 372
24.2.4 使用非网络磁盘 373
24.3 配置系统设置 373
24.3.1 关闭NUMA 373
24.3.2 设置预读 375
24.3.3 禁用透明大内存页(THP) 375
24.3.4 选择磁盘调度算法 376
24.3.5 禁用访问时间跟踪 376
24.3.6 修改限制 377
24.4 网络配置 378
24.5 系统管理 379
24.5.1 时钟同步 379
24.5.2 OOM killer 379
24.5.3 关闭定期任务 379
附录A 安装MongoDB 380
附录B 深入MongoDB 384