第一部分 MongoDB介绍 3
第1章 MongoDB简介 3
1.1 易于使用 3
1.2 易于扩展 4
1.3 丰富的功能 4
1.4 卓越的性能 5
1.5 小结 5
第2章 MongoDB基础知识 7
2.1 文档 7
2.2 集合 8
2.2.1 动态模式 8
2.2.2 命名 9
2.3 数据库 10
2.4 启动MongoDB 11
2.5 MongoDB shell简介 12
2.5.1 运行shell 12
2.5.2 MongoDB客户端 13
2.5.3 shell中的基本操作 14
2.6 数据类型 16
2.6.1 基本数据类型 16
2.6.2 日期 18
2.6.3 数组 18
2.6.4 内嵌文档 19
2.6.5 _id和ObjectId 20
2.7 使用MongoDB shell 21
2.7.1 shell小贴士 22
2.7.2 使用shell执行脚本 23
2.7.3 创建.mongorc.js文件 25
2.7.4 定制shell提示 26
2.7.5 编辑复合变量 26
2.7.6 集合命名注意事项 27
第3章 创建、更新和删除文档 29
3.1 插入并保存文档 29
3.1.1 批量插入 29
3.1.2 插入校验 30
3.2 删除文档 31
3.3 更新文档 32
3.3.1 文档替换 32
3.3.2 使用修改器 34
3.3.3 upsert 45
3.3.4 更新多个文档 47
3.3.5 返回被更新的文档 48
3.4 写入安全机制 50
第4章 查询 53
4.1 find简介 53
4.1.1 指定需要返回的键 54
4.1.2 限制 55
4.2 查询条件 55
4.2.1 查询条件 55
4.2.2 OR查询 56
4.2.3 $not 57
4.2.4 条件语义 57
4.3 特定类型的查询 58
4.3.1 null 58
4.3.2 正则表达式 59
4.3.3 查询数组 59
4.3.4 查询内嵌文档 64
4.4 $where查询 65
4.5 游标 67
4.5.1 limit、skip和sort 69
4.5.2 避免使用skip略过大量结果 70
4.5.3 高级查询选项 72
4.5.4 获取一致结果 73
4.5.5 游标生命周期 75
4.6 数据库命令 75
第二部分 设计应用 81
第5章 索引 81
5.1 索引简介 81
5.1.1 复合索引简介 84
5.1.2 使用复合索引 90
5.1.3 $操作符如何使用索引 91
5.1.4 索引对象和数组 96
5.1.5 索引基数 98
5.2 使用explain()和hint() 98
5.3 何时不应该使用索引 103
5.4 索引类型 104
5.4.1 唯一索引 104
5.4.2 稀疏索引 106
5.5 索引管理 107
5.5.1 标识索引 108
5.5.2 修改索引 108
第6章 特殊的索引和集合 111
6.1 固定集合 111
6.1.1 创建固定集合 113
6.1.2 自然排序 113
6.1.3 循环游标 115
6.1.4 没有_id索引的集合 115
6.2 TTL索引 116
6.3 全文本索引 116
6.3.1 搜索语法 119
6.3.2 优化全文本搜索 120
6.3.3 在其他语言中搜索 121
6.4 地理空间索引 121
6.4.1 地理空间查询的类型 122
6.4.2 复合地理空间索引 123
6.4.3 2d索引 123
6.5 使用GridFS存储文件 125
6.5.1 GridFS入门 126
6.5.2 在MongoDB驱动程序中使用GridFS 126
6.5.3 揭开GridFS的面纱 127
第7章 聚合 129
7.1 聚合框架 129
7.2 管道操作符 131
7.2.1 $match 132
7.2.2 $project 132
7.2.3 $group 137
7.2.4 $unwind 140
7.2.5 $sort 141
7.2.6 $limit 142
7.2.7 $skip 142
7.2.8 使用管道 142
7.3 MapReduce 143
7.3.1 示例1:找出集合中的所有键 143
7.3.2 示例2:网页分类 145
7.3.3 MongoDB和MapReduce 146
7.4 聚合命令 148
7.4.1 count 149
7.4.2 distinct 149
7.4.3 group 150
第8章 应用程序设计 155
8.1 范式化与反范式化 155
8.1.1 数据表示的例子 156
8.1.2 基数 159
8.1.3 好友、粉丝,以及其他的麻烦事项 160
8.2 优化数据操作 162
8.2.1 优化文档增长 162
8.2.2 删除旧数据 164
8.3 数据库和集合的设计 164
8.4 一致性管理 165
8.5 模式迁移 166
8.6 不适合使用MongoDB的场景 167
第三部分 复制 171
第9章 创建副本集 171
9.1 复制简介 171
9.2 建立副本集 172
9.3 配置副本集 176
9.3.1 rs辅助函数 178
9.3.2 网络注意事项 178
9.4 修改副本集配置 178
9.5 设计副本集 180
9.6 成员配置选项 184
9.6.1 选举仲裁者 184
9.6.2 优先级 185
9.6.3 隐藏成员 186
9.6.4 延迟备份节点 187
9.6.5 创建索引 187
第10章 副本集的组成 189
10.1 同步 189
10.1.1 初始化同步 190
10.1.2 处理陈旧数据 193
10.2 心跳 193
10.3 选举 195
10.4 回滚 195
第11章 从应用程序连接副本集 201
11.1 客户端到副本集的连接 201
11.2 等待写入复制 202
11.2.1 可能导致错误的原因 203
11.2.2 “w”的其他值 204
11.3 自定义复制保证规则 204
11.3.1 保证复制到每个数据中心的一台服务器上 204
11.3.2 保证写操作被复制到可见节点中的“大多数” 206
11.3.3 创建其他规则 206
11.4 将读请求发送到备份节点 207
11.4.1 出于一致性考虑 207
11.4.2 出于负载的考虑 208
11.4.3 何时可以从备份节点读取数据 208
第12章 管理 211
12.1 以单机模式启动成员 211
12.2 副本集配置 212
12.2.1 创建副本集 212
12.2.2 修改副本集成员 213
12.2.3 创建比较大的副本集 213
12.2.4 强制重新配置 214
12.3 修改成员状态 215
12.3.1 把主节点变为备份节点 215
12.3.2 阻止选举 215
12.3.3 使用维护模式 215
12.4 监控复制 216
12.4.1 获取状态 216
12.4.2 复制图谱 218
12.4.3 复制循环 220
12.4.4 禁用复制链 220
12.4.5 计算延迟 221
12.4.6 调整oplog大小 222
12.4.7 从延迟备份节点中恢复 223
12.4.8 创建索引 224
12.4.9 在预算有限的情况下进行复制 225
12.4.10 主节点如何跟踪延迟 226
12.5 主从模式 227
12.5.1 从主从模式切换到副本集模式 228
12.5.2 让副本集模仿主从模式的行为 228
第四部分 分片 233
第13章 分片 233
13.1 分片简介 233
13.2 理解集群的组件 234
13.3 快速建立一个简单的集群 235
第14章 配置分片 243
14.1 何时分片 243
14.2 启动服务器 244
14.2.1 配置服务器 244
14.2.2 mongos进程 245
14.2.3 将副本集转换为分片 245
14.2.4 增加集群容量 247
14.2.5 数据分片 247
14.3 MongoDB如何追踪集群数据 248
14.3.1 块范围 249
14.3.2 拆分块 250
14.4 均衡器 254
第15章 选择片键 257
15.1 检查使用情况 257
15.2 数据分发 258
15.2.1 升序片键 258
15.2.2 随机分发的片键 261
15.2.3 基于位置的片键 262
15.3 片键策略 263
15.3.1 散列片键 264
15.3.2 GridFS的散列片键 265
15.3.3 流水策略 266
15.3.4 多热点 267
15.4 片键规则和指导方针 270
15.4.1 片键限制 270
15.4.2 片键的势 270
15.5 控制数据分发 270
15.5.1 对多个数据库和集合使用一个集群 270
15.5.2 手动分片 272
第16章 分片管理 275
16.1 检查集群状态 275
16.1.1 使用sh.status查看集群摘要信息 275
16.1.2 检查配置信息 277
16.2 查看网络连接 282
16.2.1 查看连接统计 283
16.2.2 限制连接数量 283
16.3 服务器管理 285
16.3.1 添加服务器 285
16.3.2 修改分片的服务器 285
16.3.3 删除分片 286
16.3.4 修改配置服务器 288
16.4 数据均衡 289
16.4.1 均衡器 289
16.4.2 修改块大小 290
16.4.3 移动块 290
16.4.4 特大块 292
16.4.5 刷新配置 295
第五部分 应用管理 299
第17章 了解应用的动态 299
17.1 了解正在进行的操作 299
17.1.1 寻找有问题的操作 301
17.1.2 终止操作的执行 301
17.1.3 假象 302
17.1.4 避免幽灵操作 302
17.2 使用系统分析器 303
17.3 计算空间消耗 305
17.3.1 文档 305
17.3.2 集合 305
17.3.3 数据库 306
17.4 使用mongotop和monogostat 307
第18章 数据管理 311
18.1 配置身份验证 311
18.1.1 身份验证基本原理 312
18.1.2 配置身份验证 313
18.1.3 身份验证的工作原理 314
18.2 建立和删除索引 315
18.2.1 在独立的服务器上建立索引 315
18.2.2 在副本集上建立索引 315
18.2.3 在分片集群上建立索引 316
18.2.4 删除索引 316
18.2.5 注意内存溢出杀手 316
18.3 预热数据 317
18.3.1 将数据库移至内存 317
18.3.2 将集合移至内存 318
18.3.3 自定义预热 318
18.4 压缩数据 320
18.5 移动集合 321
18.6 预分配数据文件 322
第19章 持久性 323
19.1 日记系统的用途 323
19.1.1 批量提交写入操作 324
19.1.2 设定提交时间间隔 325
19.2 关闭日记系统 325
19.2.1 替换数据文件 325
19.2.2 修复数据文件 326
19.2.3 关于mongod.lock文件 326
19.2.4 隐蔽的异常退出 327
19.3 MongoDB无法保证的事项 327
19.4 检验数据损坏 327
19.5 副本集中的持久性 329
第六部分 服务器管理 333
第20章 启动和停止MongoDB 333
20.1 从命令行启动 333
20.2 停止MongoDB 336
20.3 安全性 337
20.3.1 数据加密 338
20.3.2 SSL安全连接 338
20.4 日志 338
第21章 监控MongoDB 341
21.1 监控内存使用状况 341
21.1.1 有关电脑内存的介绍 341
21.1.2 跟踪监测内存使用状况 342
21.1.3 跟踪监测缺页中断 343
21.1.4 减少索引树的脱靶次数 345
21.1.5 IO延迟 345
21.1.6 跟踪监测后台刷新平均时间 346
21.2 计算工作集的大小 347
21.3 跟踪监测性能状况 349
21.4 监控副本集 352
第22章 备份 355
22.1 对服务器进行备份 355
22.1.1 文件系统快照 355
22.1.2 复制数据文件 356
22.1.3 使用mongodump 357
22.2 对副本集进行备份 359
22.3 对分片集群进行备份 360
22.3.1 备份和恢复整个集群 360
22.3.2 备份和恢复单独的分片 360
22.4 使用mongooplog进行增量备份 361
第23章 部署MongoDB 363
23.1 设计系统结构 363
23.1.1 选择存储介质 363
23.1.2 推荐的RAID配置 367
23.1.3 CPU 368
23.1.4 选择操作系统 368
23.1.5 交换空间 369
23.1.6 文件系统 369
23.2 虚拟化 370
23.2.1 禁止内存过度分配 370
23.2.2 神秘的内存 370
23.2.3 处理网络磁盘的IO问题 371
23.2.4 使用非网络磁盘 372
23.3 系统配置 372
23.3.1 禁用NUMA 372
23.3.2 更智能地预读取数据 375
23.3.3 禁用大内存页面 376
23.3.4 选择一种磁盘调度算法 377
23.3.5 不要记录访问时间 377
23.3.6 修改限制 378
23.4 网络配置 379
23.5 系统管理 381
23.5.1 时钟同步 381
23.5.2 OOM Killer 381
23.5.3 关闭定期任务 382
附录A 安装MongoDB 383
附录B 深入MongoDB 387