「文档数据库之争」MongoDB和CouchDB的比较

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 「文档数据库之争」MongoDB和CouchDB的比较

MongoDB和CouchDB都是基于文档的NoSQL数据库类型。文档数据库又称mdocument store,通常用于存储半结构化数据的文档格式及其详细描述。它允许创建和更新程序,而不需要引用主模式。移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段。

MongoDB的概述

MongoDB是10gen的初创公司,它起源于2007年。它来自于文档存储家族,是典型的NoSQL数据库之一,无模式,具有较高的性能、可伸缩性和丰富的数据处理功能。这个开源数据库是用c++编写的,使用了动态模式。MongoDB的体系结构包含了根据文档结构分组为集合的文档。该数据库使用BSON。BSON是JSON的二进制表示,支持文档存储和数据交换。在MongoDB中,业务主题可以存储在最少数量的文档中,这些文档可以主要或次要地建立索引,而不会将它们分割成多个关系文档。

除了MongoDB的上述功能之外,它还提供了一个大型副本集集合,其中每个集合可以包含多个数据副本。在复制集中,所有的主函数(读和写)都在主函数集中执行,而在前一个函数失败时使用辅助函数集。MongoDB合并了sharding,它使用了水平伸缩过程。这个文档存储数据库的负载平衡属性是合理的,因为它运行在多个服务器上,因此提供了数据的重复和负载的平衡。作为回报,它还在硬件故障期间提供备份。它还使用了网格文件系统,该系统将特定的文件划分为不同的部分并分别存储它们。

MongoDB的共同特点:

  • 数据模型设计减少了对连接的需求,并提供了模式的简单演进。
  • 高性能,因为它既不包含连接,也不包含提供快速访问的事务,因此提高了性能。
  • 高可用性是由于合并了副本集,这些副本集能够在故障期间提供备份,而且非常健壮。
  • 在可伸缩性。
  • MongoDB的分片特性使它能够在分布式函数中快速高效地执行。这也是可能的,因为它支持数据的水平扩展。
  • 语言是非常丰富的查询。MongoDB有自己的查询语言Mongo查询语言,可以替代SQL语言。类似地,实用函数和map或reduce可以替代复杂的聚合函数。


图1:MongoDB架构

CouchDB的概述

CouchDB是Apache Software Foundation的一个产品,灵感来自于Lotus Notes,它也是一个基于文档的开源NoSQL数据库,主要关注于易于使用。它是一个单节点数据库,完全像其他数据库一样工作。它通常从单个节点实例开始,但可以无缝地升级到集群。它允许用户在许多服务器或vm上运行单个数据库。与单节点CouchDB相比,CouchDB集群提供了高容量和高可用性。它使用Erlang,一种通用语言。和MongoDB一样,它也使用javascript和map/reduce。它以文档集合的形式而不是表的形式存储数据。更新后的CouchDB是无锁的,这意味着在写操作期间不需要锁定数据库。这个数据库中的文档还使用了HTTP协议和JSON,以及向它们附加非JSON文件的能力。因此,CouchDB与任何支持JSON格式的应用程序或软件兼容。

CouchDB的常见特性

  • CouchDB服务器托管命名数据库,命名数据库存储数据库中唯一命名的文档,CouchDB提供一个RESTful HTTP API,用于读取和更新(添加、编辑、删除)数据库文档
  • CouchDB提供了一个基于浏览器的GUI来处理数据、权限和配置。
  • CouchDB提供了最简单的复制形式。
  • CouchDB促进了身份验证和会话支持:像web应用程序一样通过会话cookie保持身份验证打开。
  • CouchDB提供数据库级安全性,其中每个数据库的权限被划分为读者和管理员。允许读取器对CouchDB数据库进行读写。
  • CouchDB使用身份验证验证插入到数据库中的数据,以验证创建者和登录会话id是否相同。


CouchDB架构

REST API用于编写和查询数据。它还提供文档读取、添加、编辑和删除功能。它通过MVCC实现使用ACID模型而不是BASE。就像MongoDB支持设备离线时的复制一样。它使用一种称为最终一致性的特殊复制模型。CouchDB在数据方面是高度可靠的。单节点数据库使用仅追加的抗崩溃数据结构,而多模式或集群数据库可以冗余地保存数据,以便在用户需要时提供数据。CouchDB可以根据大集群(如全球集群)扩展到小集群(如移动设备)。CouchDB能够在任何Android或iOS设备上运行,这使得它在其他数据库中脱颖而出。

CouchDB体系结构是分布式的,支持双向同步。由于使用唯一id,它不需要任何模式。尽管CouchDB遵循CAP模型的AP(可用性和分区容错)特性,但为了克服交易一致性,它在实际基础上遵循ACID模型。

CouchDB和MongoDB的比较

特性 CouchDB MongoDB
数据模型 它遵循面向文档的模型,数据以JSON格式表示。 它遵循面向文档的模型,但数据以BSON格式表示
接口 CouchDB使用基于HTTP/ REST的接口。它非常直观,设计非常好。 MongoDB在TCP/IP上使用二进制协议和自定义协议。
对象存储 在CouchDB中,数据库包含文档。 在MongoDB中,数据库包含集合,而集合包含文档。
速度 它的读取速度是关键的数据库,MongoDB比CouchDB快 MongoDB提供了更快的读取速度。
手机支持 CouchDB可以运行在苹果iOS和Android设备上,为移动设备提供支持。 没有提供移动支援
大小 数据库可以随着CouchDB而增长;当结构从一开始就没有明确定义时,MongoDB更适合快速增长。 如果我们有一个快速增长的数据库,MongoDB是更好的选择。
查询方法 查询使用map-reduce函数。虽然它可能是一种优雅的解决方案,但对于具有传统SQL经验的人来说,学习它可能更加困难。 MongoDB采用Map/Reduce (JavaScript)创建基于集合+对象的查询语言。对于有SQL知识的用户,MongoDB更容易学习,因为它更接近语法。
复制 CouchDB支持使用自定义冲突解决功能的主-主复制。 MongoDB支持主从复制。
并发性 它遵循MVCC(多版本并发控制)。 就地更新。
首选项 CouchDB支持可用性。 MongoDB支持一致性
性能的一致性 CouchDB比MongoDB更安全
一致性 CouchDB最终是一致的。 MongoDB是强一致性的。
编写语言 Erlang C++.
分析 如果我们需要一个在移动设备上运行的数据库,需要主-主复制或单服务器持久性,那么CouchDB是一个很好的选择。 如果我们正在寻找最大的吞吐量,或者有一个快速增长的数据库,MongoDB是最好的选择。


CouchDB和MongoDB:截然不同的查询

CouchDB和MongDB都是面向文档的数据存储,它们使用JSON文档,但是当涉及到查询时,这两个数据库就完全不同了。CouchDB需要预定义的视图(本质上是JavaScript的MapReduce函数),MongoDB支持动态查询(基本上是我们习惯的常规RDBMS特别SQL查询)。

例如,为了使用Groovy的RESTClient在CouchDB中插入一些数据,并发出一个RESTful post,如下所示:

    import static groovyx.net.http.ContentType.JSONimport groovyx.net.http.RESTClientdef client = new RESTClient("http://localhost:5498/")response = client.put(path: "parking_tickets/1280002020",contentType: JSON,requestContentType: JSON,body: [officer: "Micheal Jordan",location: "189 Berkely Road",vehicle_plate: "KL5800",offense: "Parked in no parking zone",date: "2020/02/01"])

    示例代码查询任何官员财产为“Micheal Jordan”的文件的函数:


    function(doc) {if(doc.officer == "Micheal Jordan"){emit(null, doc);}}

    当我们发出一个HTTP GET请求到那个视图的名字,我们可以期望至少一个文档如下:


      response = client.get(path: "parking_tickets/_view/by_name/officer_grey",contentType: JSON, requestContentType: JSON)assert response.data.total_rows == 1response.data.rows.each{assert it.value.officer == "Micheal Jordan"}

      MongoDB的工作方式很像我们习惯使用的普通数据库:我们可以在运行时查询我们内心想要的任何东西。

      使用MongoDB的本地Java驱动程序插入停车罚单的相同实例:

        DBCollection coll = db.getCollection("parking_tickets");BasicDBObject doc = new BasicDBObject();doc.put("officer", "Micheal Jordan");doc.put("location", "189 Berkely Road ");doc.put("vehicle_plate", "KL5800");//...coll.insert(doc);

        只需对警官的财产进行查询,即可查询警官Micheal Jordan从MongoDB发出的任何罚单:

          BasicDBObject query = new BasicDBObject();query.put("officer", "Micheal Jordan");DBCursor cur = coll.find(query);while (cur.hasNext()) {System.out.println(cur.next());}

          结论

          在这个博客中,我们比较了两种基于文档的NoSQL数据库——MongoDB和CouchDB。该表概述了这两个数据库之间的主要参数比较。正如我们所看到的,项目的优先级将决定系统的选择。主要区别包括复制方法和平台支持。而且,从比较中可以清楚地看出,如果应用程序需要更高的效率和速度,那么MongoDB是比CouchDB更好的选择。如果用户需要在移动设备上运行数据库,并且还需要多主机复制,那么CouchDB是一个明显的选择。此外,如果数据库快速增长,MongoDB比CouchDB更适合。使用CouchDB的主要优势是它在移动设备(Android和iOS)上得到支持,而不是在MongoDB上。因此,基本上,不同的应用程序需求会根据场景需要不同的数据库。

          我们观察到MongoDB比CouchDB稍微好一点,因为它使用类似sql的查询结构,而且前者更容易实现。另外,对于使用动态查询,MongoDB是一个更好的选择。关于这两个数据库的安全性,研究仍在进行中,很难说哪一个提供了更好的和安全的环境。

          相关实践学习
          MongoDB数据库入门
          MongoDB数据库入门实验。
          快速掌握 MongoDB 数据库
          本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
          相关文章
          |
          9天前
          |
          存储 NoSQL 关系型数据库
          非关系型数据库-MongoDB技术(二)
          非关系型数据库-MongoDB技术(二)
          |
          9天前
          |
          NoSQL 关系型数据库 MongoDB
          非关系型数据库-MongoDB技术(一)
          非关系型数据库-MongoDB技术(一)
          |
          2天前
          |
          存储 NoSQL 前端开发
          前端轻量级数据库mongodb
          【10月更文挑战第2天】MongoDB 是一个基于分布式文件存储的开源数据库系统,不属于前端轻量级数据库,而是后端数据库。它使用 BSON 格式存储数据,支持复杂的数据结构,适用于内容管理系统、物联网等领域。MongoDB 通过动态模式和面向对象的数据存储方式,提供了灵活的数据模型。在 Web 应用中,它通常作为后端存储,通过 API 与前端交互,实现高效的数据管理和实时更新。
          |
          9天前
          |
          SQL NoSQL Shell
          03 MongoDB文档的各种增加、更新、删除操作总结
          文章总结了MongoDB中文档的增删改操作,包括插入文档、更新现有文档以及删除文档的具体方法和示例。
          23 0
          |
          2月前
          |
          C# 开发者 Windows
          全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
          【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
          50 0
          |
          JSON NoSQL Java
          mongoDB导出数据库所有集合内容到json文件
          网上搜了一圈,官方并有提供批量导出所有集合到json文件的方法。有不少脚本可以实现,但是我还是习惯用java,如下 package starcLL.
          2205 0
          |
          2月前
          |
          运维 监控 NoSQL
          【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
          【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
          48 4
          |
          2月前
          |
          监控 NoSQL MongoDB
          MongoDB数据库的索引管理技巧
          【8月更文挑战第20天】MongoDB数据库的索引管理技巧
          48 1
          |
          2月前
          |
          监控 NoSQL MongoDB
          mongodb数据库 使用技巧
          【8月更文挑战第20天】mongodb数据库 使用技巧
          36 1
          |
          2月前
          |
          JSON NoSQL Ubuntu
          在Ubuntu 14.04上如何备份、恢复和迁移MongoDB数据库
          在Ubuntu 14.04上如何备份、恢复和迁移MongoDB数据库
          62 1
          下一篇
          无影云桌面