“阅读本文大约需要 4 分钟
MongoDB 作为 NoSQL 数据库的代表,在最近几年内已经迅速成为主流的数据存储解决方案之一,在各种应用的系统架构中承担了举足轻重的重要。本文通过几个简单明了的示例帮你快速掌握 MongoDB 的基础概念和实用方法。
MongoDB 是什么?
从官网 https://www.mongodb.com/what-is-mongodb 上的描述来看 MongoDB 是一款基于文档(Document) 结构的数据库,所谓文档结构可以认为是不要求固定 schema,类似 Json 的数据结构,事实上 MongoDB 也是实用 BSON,一种 JSON 的二进制格式来存储数据的。
相对于传统的关系型数据库,MongoDB 的特点非常明显,主要有以下几点:
灵活的数据结构,类似 Json 的格式,可以根据业务的发展自由的增加字段
良好的性能表现,通过 sharding 等机制将数据自动分散在不同节点,能够把压力均匀分布
高可用,MongoDB 自带了完善的 Replica 机制,会将数据复制到不同的节点,根据节点的可用情况自动切换
丰富的索引类型,支持 Single, Compound, Geospatial 等不同种类的索引类型,满足绝大部分业务场景的需求
同时也需要注意 MongoDB 对于查询 Join 操作以及事务的支持有限,所谓有所得必有所失,这需要我们在具体的开发过程中注意。
安装
我们可以从官方下载当前 MongoDB 最新稳定的社区版本,https://www.mongodb.com/download-center/community,在页面中选择对应的操作系统,点击下载即可。
Windows 版本的安装过程非常简单,一路 next 就好,建议将 MongoDB 作为 Windows 的一项服务,这样管理起来也较为方便。
Linux/MacOSX 的安装过程也很简单,将压缩包解压后,将解压目录下的 `bin` 子目录添加到 `PATH` 的环境变量下即可。
通过 Windows 服务启动,或是安装目录下的 `mongod` 来启动服务,默认端口为 27017。
使用
安装目录下的 `bin` 子目录下的 `mongo` 是 MongoDB Shell 程序,使用它可以连接到本地或是远程的服务器上。不加任何参数运行它会按照默认端口连接本机的 MongoDB 服务。
连接成功后,我们可以输入些命令来熟悉一下 MongoDB。`help` 命令会展示一些基本的 MongoDB Shell 命令,比较常用的如下:
show dbs: 显示当前 MongoDB 中存在的 database
show collections: 显示 MongoDB 中存在的 collection,具体 collection 的定义后面会解释
use <db_name>: 切换当前使用的 database, 如果当前 db 不存在则会创建一个新的
基础操作
与传统数据库比较,mongoDB 也有自己的一套数据结构,简单来说,mongoDB 中的 db 对应了数据库中的 database,而 collection 则对应了 table 的概念,存放入 collection 中的每个 json 对象则可以理解为 table 中的每一条记录。下面我们看一些操作的示例代码来帮助理解。
先创建一个我们自己的数据库,可以直接使用 use 命令来完成。
然后我们新建一个 collection,对应关系型数据库中表的概念。
可以看到我们已经建立了一个名为 users 的 collection。接着我们就可以对这个 collection 进行一些更新操作。
上面的代码中我们对 users collection 插入了一条记录,可以看到 mongoDB 接受格式为 json 的数据类型,并且插入成功后,mongoDB 会自动产生一个 ObjectId,最为这条记录的唯一序列号。我们再运行以下的代码,批量插入一些数据。
然后我们来看看如何查询这些数据。
通过 find 方法我们可以查的 collection 中的所有数据,而通过不同的参数可以进行过滤,看下面的例子。
查找 collection 中 status 字段为 pending的记录,我们再尝试增加一些其他的条件。
上面的的查询就有点意思,会查询出 status为 pengding且 age大于 25 的记录,类似 SQL 中的 select * from users where stats = 'pending' and age > 25
mongoDB 提供了很丰富的查询接口,也支持较为复杂的关联查询,如果你有使用一些函数式编程语言的经验,你会发现 mongoDB 的查询接口有模式匹配的影子在。如果你想更加深入的了解 mongoDB 的查询功能,可以关注我们后续 mongoDB 的进阶文章,了解更多的细节与知识。
高级特性
与其他的 NoSQL 数据库类似,mongoDB 支持高可用 H.A 和 Sharding 特性来保证数据的高可用性与性能的水平扩展性。下面我们来大致介绍 mongoDB 中的 H.A 和 Sharding 概念。
Replication
mongoDB 通过 Replication (副本) 的机制来保证高可用性,即每份数据会按照配置在多个服务器实例上存放。在一个典型的 Replication 配置中,参与的 mongoDB 分为如下的 3 种角色:
Primary: 即主节点,能够对外部提供 read/write 服务,在同一时间,一个集群中只能有一个 Primary 节点。
Secondary: 从属节点,指对外提供 read 服务,数据由 Primary 节点复制而来,在一个集群中会存在多个 Secondary 节点。
Arbiter: 仲裁者,当 Primary 节点发生异常,例如无法提供服务器时,按照选举算法,将某个符合条件的 Secondary 节点提升为新的 Primary 节点对外提供服务。
具体的架构图可参考如下来自官方的图片:
Sharding
与之前我们介绍过的 Redis 类似,当数据量大到一定程度,单机无法高效存储的时候,将数据按照一定算法,水平扩展到多台机器上的做法被称为 Sharding (分片)。在启用 Sharding 的情况下,collection 的数据被打散到各个服务器上,因此不能直接连接某个 mongoDB 的实例,而是需要通过名为 `mongos` 的路由服务来获取数据的信息,参考如下的官方图片:
在具体的 Sharding 算法中,mongoDB 支持两种常用的算法,即按照插入数据中某个字段的 hash 值进行分配的 Hashed Sharding,和按照范围来分配的 Ranged Sharding算法。这两种算法各有优缺点,重要的是能够在合适的场合选择合适的算法。
结语
mongoDB 作为一个老牌的 NoSQL 数据库经过那么多年的发展,已经被证明在很多场景是有着无可替代的作用。如果你的项目需要存储大量结构自由,需要很高扩展性,且对读写性能有一定要求的场合,那 mongoDB 可能是你最好的选择。且简单易用的集群配置,也可以让大部分新手快速上手,但在运维中我们依然需要面临这样那样的问题。如果你有兴趣继续深入了解 mongoDB 在实际项目中的使用经验和如何趟坑,不妨关注我们的微信号,我们后续会推出大量更加深入 mongoDB 内部原理的文章,所以还等什么呢?!
15年从业经验,不仅在国内著名的大型金融集团做过甲方,担任高级系统架构专家角色,也在第一梯队的互联网公司金融部门做过数据智能相关工作。
也曾任职于大型系统集成商,负责保险,银行核心系统的落地和实施,也在创业团队从0到1研发产品,在业界获得很高的占有量。
如果感兴趣可以加我公众号,搜索“且把金针度与人”或个人微信
网友评论