开发者如何学好 MongoDB

作为一名研发,数据库是或多或少都会接触到的技术。MongoDB 是火热的 NoSQL 之一,我们怎样才能学好 MongoDB 呢?本篇文章,我们将从以下几方面讨论这个话题:

MongoDB 是什么

我如何确定我需要学习 MongoDB

开发者应该掌握 MongoDB 的哪些知识

学习的选择和困境

我们先来了解一下,MongoDB 为何物。

NoSQL 泛指非关系型数据库,该词是关系型数据库(即 SQL)的相对称呼。MongoDB 是非关系型数据库中较为人熟知的一种。

它拥有很多优秀特性,例如高性能、高可用、支持丰富的查询语句、无需预定义数据模型和水平可伸缩等,适合存储结构化、半结构化的文档和特定格式的文档,这些特性使它受到众多开发者的青睐。

与 MySQL 数据库不同的是,MongoDB 不需要预先定义表和字段,这正是它灵活性的体现。

MongoDB 可以拥有多个数据库,每个数据库可以拥有多个集合,每个集合可以存储多份文档,这种关系与 SQL 数据库中的“数据库、表、数据”相当。下图描述了 MongoDB 中数据库、集合和文档的关系:

数据库 fotoo 中有两个集合,它们分别是 player 和 books。每个集合中都包含了许多文档,例如集合 books 中关于书籍《红楼梦》的文档,集合 player 中关于球员 James 的文档。

在查询方面,一个简单的 MySQL 查询语句为:

SELECT * FROM tablename

对应的 MongoDB 查询语句为:

db.tablename.find()

在面对多步骤的查询条件时,MongoDB 更游刃有余。例如:

“统计数据库 artic 中 score 大于 70 且小于 90 的文档数量”

这样的需求,用 MongoDB 的聚合操作就可以轻松完成,对应示例如下:

db.artic.aggregate([ {$match: {score: {$gt: 70, $lt: 90}}}, {$group: {_id: null, number: {$sum: 1}}} ])

这个例子或许简单了些,在 MySQL 中我们可以用 count 和 where 完成,但如果复杂度再提高四五个等级呢?例如在此基础上增加对某个字段的运算、替换、排序、分组计数、增删字段,用 MySQL 来实现就会很头疼,而 MongoDB 的聚合可以让我们轻松地完成这类复杂需求。

我如何确定我需要学习 MongoDB

MongoDB 是近些年涌现的几十种 NoSQL 中第一梯队的成员,另外一个为人熟知的是 Redis。

你可能会有这样的疑问:”我如何确定我需要学习 MongoDB 呢“。

面对这个问题,我们可以通过 MongoDB 的特点和应用场景着手。

MongoDB 适合存储结构确定或不确定的文档。例如爬虫爬取的信息常缺失字段的情况或字段参差不齐的情况;

对数据库可用性要求较高的情况。MySQL 这类数据库要做到负载均衡、自动容灾和数据同步需要借助外部工具,而 MongoDB 的复制集可以让我们轻松完成这一系列的工作。相对接借助第三方工具来说,复制集的稳定性更高。

分库分表是 WEB 开发中常用到的数据库优化手段,MySQL 的分库分表要考虑的问题非常多,例如字段冗余、数据组装跨节点分页、排序和数据迁移等,而 MongoDB 的分片可以让我们轻松完成“分库分表”的工作。MongoDB 的分片机制使我们不必将心思放在由“分库分表”带来的问题,而是专注于具体需求。

同样的,MySQL 的权限控制、定义数据模型、数据库备份和恢复等功能在 MongoDB 上也有。

MongoDB 中支持地理位置的存储和查询,这意味着 MongoDB 可以用于共享单车、共享雨伞、汽车定位等业务中。

我们常用的关系型数据库无法满足 WEB2.0 时代的需求,在实际应用中暴露了很多难以克服的问题。

NoSQL 的产生就是为了解决例如 海量数据的存储弹性可伸缩灵活性 等方面的挑战,作为一名合格的开发者,我我们应该抽空学习 SQL 以外的数据库知识,例如 MongoDB。

开发者应该掌握 MongoDB 的哪些知识

学习前,我们需要明白自身定位:专业 DBA 或者日常开发使用。

MongoDB 有完善的培训体系和对应的认证考试,对于希望成为专业 DBA 的朋友我建议到 MongoDB 官方网站了解。

而对于仅需要 满足日常开发需求 的朋友,我建议学习的内容如下:

MongoDB 在各个平台的安装方法

MongoDB 数据库和集合的基本操作

MongoDB 文档 CRUD 操作,包括能够丰富 CRUD 的投影和修饰符等

MongoDB 流式聚合操作,这能够在数据库层面轻松完成复杂数据的处理,而不是用编程语言来处理

MongoDB 的数据模型,虽然它可以存储不规则的文档,但有些情况下定义数据模型可以提高查询效率

下图描述了一种聚合操作的完整过程:

当然,除了这些基本操作之外我们还可以 学习更多的知识提高个人竞争力 ,这些知识是:

MongoDB 执行计划和索引,执行计划可以让我们清楚的了解到查询语句的效率,而索引则是优化查询效率的常用手段

MongoDB 的复制集,这是提高 MongoDB 可用性,保证数据服务不停机的最佳手段

MongoDB 的分片,分片能够在数据量变得庞大之后保证效率

MongoDB 的事物,如果你将 MongoDB 用于 WEB 网站,那么事物是你必须学习的知识

MongoDB 数据库备份和还原,有了复制集后,备份就显得不是那么重要了,但并不是没有这个需求。而且 MongoDB 的备份可以精细到文档,这就非常有意义了。

学习的选择和困境

有一定工作经验的开发者,大多数情况下都会选择自学。有些在网上搜索对应的文章,有些则直接翻阅官方文档。

我推荐的方式是翻阅官方文档,在遇到难以理解的观点时通过搜索引擎查找网友分享的文章。

自学的优点很多,缺点也很明显。例如:

断断续续的学习,无法保持专注学习

耗费的时间很长,虽然知道应该学习哪些方面的知识,但文档并不是按你所想而规划的,翻阅文档要费很多功夫

知识不成体系,东看看西看看,没有归纳容易忘记

学习就需要记笔记,这又是一件很费时间的事情

官方文档有些观点难以理解,卡在半路很难受

零星学了一两个月,也不确定学会了没有,内心毫无把握

如果不自学,就得找一些成体系的课程来帮助自己快速进步,少走弯路。知识付费时代,在条件允许的情况下适当地投入也是很好的选择。

但面对动辄几百块的视频课程,不少开发者还是感觉略有压力,毕竟我们搬砖的经济压力也非常大。培训班就更不用说了,很少有专业教授单个数据库知识的,而且费用比视频课程更贵。

考虑到这些问题,这里推荐 韦世东 的 GitChat 文章 《超高性价比的 MongoDB 零基础快速入门实战教程》 ,这也是一个收费教程,但它售价不到 10 块钱。

文章作者韦世东是: 图灵签约作者、电子工业出版社约稿作者,华为云认证云享专家、掘金社区优秀作者、GitChat 认证作者,开源项目 aiowebsocket 作者 。所以在文章质量上,大家可以放心。

这篇文章的内容几乎囊括了上面我们提到的所有知识点,看完这篇仅 5 万词的文章,你将收获:

文档的 CRUD 操作和 Cursor 对象

掌握流式聚合操作,轻松面对任何数据处理需求

了解 MongoDB 的查询效率和优化

如何提高 MongoDB 的可用性

如何应对数据服务故障

理解 MongoDB 的访问控制

学会用数据模型降低数据冗余,提高效率

掌握 mongodump 数据备份与还原方法

这样就可以 胜任日常开发中对数据库操作能力的要求 了。这篇文章适合对 MongoDB 感兴趣的零基础开发者或者有一定基础,想要继续巩固和加深学习的开发者。

文章篇幅很长,内容详尽且不乏优质配图,例如描述复制集节点关系的图:

描述节主点掉线,重新选举主节点的图: