二、什么是MongoDB

本文主要讨论这几个问题:

  1. MongoDB的功能特性
  2. MongoDB的优缺点
  3. 与关系型数据库,其他NoSQL数据库对比
  4. 适用场景

首先,用一句话简单定义一下什么是MongoDB:

MongoDB是面向文档的,schema-less(无模式或动态模式)的,支持二级索引,支持数据复制冗余、自动故障转移,支持数据分片,负载均衡,易扩展,能为海量数据提供支撑的非关系型数据库。

MongoDB仍然在迅速发展中,功能也在不断增强,虽然上述定义无法完整概括MongoDB的功能特性,但却是MongoDB最核心和本质的方面。

1.MongoDB的功能特性

  1. 文档型
    • MongoDB采用一种称为BSON(Binary JSON,二进制json)的文档格式来进行数据存储和传输。
    • 很多人都误认为MongoDB使用的是JSON,实际上使用的是BSON,一种JSON的二进制表达形式。
    • MongoDB为什么要采用文档结构来作为存储格式?个人认为,首先,文档以一种自描述(文档能自己表现数据是什么类型,数据的结构字段是什么)的形式,使得MongoDB具备了schema-less的可能。其次,文档的表现形式,嵌套特性,能够很好的表现编程语言中的对象。再次,文档之间没有依赖关系,很适合数据分块以及迁移,适合分片集群。
    • 关于BSON,后文会进一步详细介绍。
  2. schema-less
    • schema-less是相对于关系型数据库而言,个人认为,将其理解为动态模式可能比无模式更为贴切。
    • 在关系型数据库中,比如首先定义数据的模式(需要建哪些表,表有哪些字段,字段是什么类型,长度等等),然后才能对数据进行存取操作。
    • 而在MongoDB中,无须定义数据模式,就可以直接存取数据。而且集合中(集合相当于表)不同文档可以拥有不同的数据字段(字段相当于列)。这样,我们就可以自由的增减字段,再也不用害怕产品加需求加字段了。
  3. 支持二级索引、地理空间索引、全文索引
    • 很多NoSQL都不支持二级索引,只支持根据主键的随机查询或者scan等简单查询。而MongoDB支持二级索引,能很好的支持不同字段,多个字段的查询和排序需求。
    • MongoDB支持地理空间索引,从而支持基于位置,距离的应用查询。
    • MongoDB支持全文索引,能提供简单的全文检索需求。
  4. 支持聚合操作
    • 除了支持CRUD操作外,MongoDB还提供了三种方式来进行聚合操作,为统计计算以及报表等需求提供支撑。
  5. 数据复制冗余,自动故障转移
    • MongoDB通过副本集,实现主从节点的数据复制同步,当主节点down掉后,通过选举机制,重新选举主节点,从而实现故障转移。
  6. 数据分片,负载均衡
    • MongoDB支持集合分片,用户提交的数据或查询数据请求可以自动路由到不同的分片节点上。并且在节点间数据不均衡时,自动迁移数据块,从而实现数据均衡。
  7. 易于使用和管理
    • MongoDB不仅提供了副本集,分片集群的功能,而且还提供了数据导入导出,备份恢复,节点状态统计监控等工具,通过这种all-in-one的方式,使得学习和管理维护MongoDB都变得更加容易。
  8. 接近关系型数据库的操作习惯
    • 关系型数据库中的很多sql操作,在MongoDB中都能找到对应的方法。并且MongoDB提供的功能也越来越丰富,更加接近关系型数据库的使用习惯。
    • 相比其他NoSQL,习惯关系型数据库的程序员会觉得更亲切容易上手,同时,基于关系型数据库的项目也更容易迁移到MongoDB上来。
  9. GridFS
    • 小于16M的二进制数据,可以使用一般的BSON文档进行存储。
    • 而对于大于16M的二进制数据,MongoDB提供一种叫做GridFS的文件系统进行存储。
  10. 多存储引擎
    • 从3.0开始,MongoDB采用插件式的存储引擎架构,可以选择多种存储引擎(MMAPv1, WiredTiger, In-Memory)。

2.MongoDB的优缺点

MongoDB的优点其实也就是上面介绍的MongoDB的一些突出的功能特性。
这里主要说说MongoDB有哪些缺点。其实,其中有些缺点,换个角度看,实际上也是不得已而为之。就像前篇介绍的CAP原则一样,为了某种属性,只能牺牲另外一种属性。例如:
1. MongoDB不支持join(虽然在3.2企业版中已经支持简单的join操作,但是一定是以牺牲性能为前提的)。join操作不仅牺牲性能,而且使得数据分片难以实现。
2. MongoDB不支持事务(不支持多文档操作事务)。两阶段提交等分布式事务算法性能都不是很好。
3. MongoDB数据占用大量磁盘空间(使用WiredTiger存储引擎,开启压缩后已经很好的改善这个问题)。
4. MongoDB非常“吃”内存(老的MMAPv1采用内存映射文件的方式,内存都交由操作系统进行管理,而在新的WiredTiger存储引擎中,可以配置缓存的使用量大小)

3.与关系型数据库,其他NoSQL数据库对比

相比HBase, Cassandra等NoSQL,MongoDB算是最接近关系型数据库的NoSQL。
MongoDB相比于关系型数据库,通过副本集,分片集群,提供了高可用和海量数据的支撑能力。
MongoDB相比于其他NoSQL,又提供了更加接近关系型数据库的使用习惯和丰富的操作及功能。

4.适用场景

这可能是初接触MongoDB或正在项目调研选型的同学最关心的问题。
就个人使用经验和接触来看,MongoDB适用于大多数一般的业务需求,比如爬虫,评论,消息,游戏行业等。
其实,这个问题,也许反过来思考,可能更容易得到答案,也就是MongoDB有哪些不适用场景。结合上面介绍的MongoDB缺点和特性,比如项目是否需要复杂的事务(MongoDB不支持),是否需要高可用,海量数据的支撑(MongoDB支持)就能比较容易的进行评估选型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值