我们先来了解一下,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 的聚合可以让我们轻松地完成这类复杂需求。
我们常用的关系型数据库无法满足 WEB2.0 时代的需求,在实际应用中暴露了很多难以克服的问题。
NoSQL 的产生就是为了解决例如海量数据的存储、弹性可伸缩和灵活性等方面的挑战,作为一名合格的开发者,我我们应该抽空学习 SQL 以外的数据库知识,例如 MongoDB。
学习前,我们需要明白自身定位:专业 DBA 或者日常开发使用。
MongoDB 有完善的培训体系和对应的认证考试,对于希望成为专业 DBA 的朋友我建议到 MongoDB 官方网站了解。
而对于仅需要满足日常开发需求的朋友,我建议学习的内容如下:
下图描述了一种聚合操作的完整过程:
当然,除了这些基本操作之外我们还可以学习更多的知识提高个人竞争力,这些知识是:
有一定工作经验的开发者,大多数情况下都会选择自学。有些在网上搜索对应的文章,有些则直接翻阅官方文档。
我推荐的方式是翻阅官方文档,在遇到难以理解的观点时通过搜索引擎查找网友分享的文章。
自学的优点很多,缺点也很明显。例如:
如果不自学,就得找一些成体系的课程来帮助自己快速进步,少走弯路。知识付费时代,在条件允许的情况下适当地投入也是很好的选择。
但面对动辄几百块的视频课程,不少开发者还是感觉略有压力,毕竟我们搬砖的经济压力也非常大。培训班就更不用说了,很少有专业教授单个数据库知识的,而且费用比视频课程更贵。
考虑到这些问题,这里推荐韦世东的 GitChat 文章 《超高性价比的 MongoDB 零基础快速入门实战教程》,这也是一个收费教程,但它售价不到 10 块钱。
文章作者韦世东是:图灵签约作者、电子工业出版社约稿作者,华为云认证云享专家、掘金社区优秀作者、GitChat 认证作者,开源项目 aiowebsocket 作者。所以在文章质量上,大家可以放心。
这篇文章的内容几乎囊括了上面我们提到的所有知识点,看完这篇仅 5 万词的文章,你将收获:
这样就可以胜任日常开发中对数据库操作能力的要求了。这篇文章适合对 MongoDB 感兴趣的零基础开发者或者有一定基础,想要继续巩固和加深学习的开发者。
文章篇幅很长,内容详尽且不乏优质配图,例如描述复制集节点关系的图:
描述节主点掉线,重新选举主节点的图: