NoSQL 对决:MongoDB 与 Couchbase

文档数据库可能是其中最流行的 NoSQL 数据库变体。它们具有极大的灵活性——可以非常轻松地扩展或更改模式——使它们适用于广泛的应用程序,并且它们的对象性质非常适合当前的编程实践。反过来,Couchbase Server 和 MongoDB 已成为开源文档数据库中两个更受欢迎的代表,尽管 Couchbase Server 在文档数据库行列中是最近才出现的。

在这种情况下,“文档”一词并不意味着文字处理文件或 PDF。相反,文档是一种定义为命名字段集合的数据结构。 JSON(JavaScript 对象表示法)是目前在面向文档的数据库中定义文档时使用最广泛的表示法。 JSON 作为对象表示法的优势在于,一旦您理解了它的语法(并且 JSON 非常容易掌握),那么您就拥有了定义文档数据库架构所需的一切。这是因为,在文档数据库中,每个文档都具有自己的架构,这与 RDBMS 不同,在 RDBMS 中,给定表中的每一行都必须具有相同的列。

[ Andrew C. Oliver 回答了每个人心中的问题:我应该使用哪个该死的数据库?| InfoWorld 上还有:现在是 NoSQL 标准的时代 |每天在《InfoWorld Daily》时事通讯中获取关键故事的摘要。 ]

最新版本的 Couchbase Server 和 MongoDB 均已发布。 2012年12月,沙发底座发布了 Couchbase Server 2.0,该版本使 Couchbase Server 成为成熟的文档数据库。在此版本之前,用户可以将 JSON 数据存储到 Couchbase 中,但数据库将 JSON 数据写入为 blob。 Couchbase 实际上是一个键/值数据库。

10代本周刚刚发布了 MongoDB 2.4。 MongoDB 从一开始就是一个文档数据库。此最新版本包含许多性能和可用性增强功能。

这两个数据库都设计为在商用硬件上运行,并通过分片进行水平扩展(在 Couchbase 中,分片的大致相当于称为分区)。这两个数据库都使用 JSON 作为文档定义符号,但在 MongoDB 中,该符号是 BSON(二进制 JSON),它是 JSON 的二进制编码超集,定义了 JSON 中未找到的有用数据类型。虽然这两个数据库都采用 JavaScript 作为主要数据操作语言,但都为所有最流行的编程语言提供 API,以允许应用程序直接访问数据库操作。

主要差异当然也有差异。首先,MongoDB对文档的处理更加发达。这在 mongo shell 中表现得最为明显,它具有为 MongoDB 数据库提供管理和开发窗口的双重目的。数据库、集合和文档是 shell 中的一流实体。集合实际上是数据库对象的属性。

这并不是说 Couchbase 陷入困境。您可以从 Couchbase 管理 GUI 轻松管理 Couchbase 集群 - 添加、删除和获取文档,而 MongoDB 没有对应的 GUI。事实上,如果您更喜欢通过 GUI 控制台进行管理,请为 Couchbase Server 打一分。然而,如果您喜欢命令行生活,那么您将会转向 MongoDB。

收集统计数据的基于云的 MongoDB 监控服务 (MMS) 并不意味着是一个成熟的数据库管理界面。但 MongoDB 的环境在 mongo shell 中抽象的数据对象和它们建模的数据库实体之间提供了近乎无缝的连接。当您发现 MongoDB 允许您使用单个函数调用在特定文档字段上创建索引时,这一点尤其明显,而 Couchbase 中的索引必须通过更复杂的 MapReduce 操作创建。

此外,Couchbase 文档是通过 JSON 描述的,而 MongoDB 文档是通过 BSON 描述的;后一种表示法包括更丰富的有用数据类型,例如 32 位和 64 位整数类型、日期类型和字节数组。两者都支持地理空间数据和查询,但 Couchbase 中的这种支持目前处于实验阶段,可能不会停留太久。 2.4 版本中的新增功能,MongoDB 的全文搜索功能也与数据库集成。 Couchbase Server 中提供了类似的功能,但需要一个插件弹性搜索工具。

Couchbase Server 和 MongoDB 都通过复制提供数据安全性,无论是在集群内部(通过不可见的副本文档创建来保护实时文档免遭丢失)还是在集群外部(通过跨数据中心复制)。此外,两者都通过分片提供访问并行性。然而,Couchbase 和 MongoDB 都支持哈希分片,而 MongoDB 支持范围分片和“标签”分片。这是一把两刃剑。一方面,它为数据库管理员提供了极大的灵活性。另一方面,它的滥用可能会导致集群不平衡。

Mapreduce 是 Couchbase 和 MongoDB 中使用的关键工具,但用途不同。在 MongoDB 中,mapreduce 充当通用数据处理、信息聚合和分析的手段。在Couchbase中,它是为了查询数据库中的数据而创建索引的手段。 (我们怀疑,这与较差的文档处理一样,是 Couchbase 最近才转变为文档数据库的结果。)因此,在 MongoDB 中创建索引和执行即席查询变得更容易。

Couchbase 完全融入了 Memcached,这在 MongoDB 中是无可比拟的,而 Memcached 是高吞吐量、数据密集型 Internet 和 Intranet 应用程序的通用对象缓存系统的强大辅助工具。如果您的应用程序需要带有数据库的 Memcache 服务器,那么 Couchbase 就是您的最佳选择。

一般来说,这两个系统在提供的功能方面不相上下,尽管这些功能的实现方式可能有所不同。此外,随着发展的进行,一种可能相对于另一种的优势肯定会出现或消失。两者都提供所有流行编程语言的数据库驱动程序和客户端框架,都是开源的,都易于安装,并且都享有大量的在线文档和活跃的社区支持。正如这种完美匹配的系统的典型情况一样,任何人在确定其中一个系统时可以给出的最佳建议是安装它们并尝试它们。

Couchbase 将 Couchbase Server 推广为实时访问解决方案,而不是数据仓库。 Couchbase Server 也不适合面向批处理的分析处理——它被设计为一个操作数据存储。

虽然 Couchbase Server 基于 Apache CouchDB,但它比 CouchDB 进行了增量修改。首先,Couchbase 是 CouchDB 和 Memcached(分布式内存中键/值存储系统)的结合体。事实上,Couchbase 可以用作 Memcached 的直接替代品。该系统提供了一个单独的端口,未经修改的旧版 Memcached 客户端可以使用,以及“智能 SDK”和代理工具,可提高其作为 Memcached 服务器的性能。

例如,您可以使用“胖客户端”部署模型,它将不断更新的 Memcached 节点拓扑知识放置在客户端层。这可以加快响应速度,因为对特定 Memcached 对象的任何请求都将从客户端直接发送到该对象的缓存节点。这种胖客户端方法在 Couchbase 系统对节点崩溃的恢复能力方面也发挥着重要作用(稍后描述)。

Couchbase 包含自己的基于 Memcached 的对象级缓存系统,但有所增强。例如,Couchbase 使用 NRU(最近未使用)算法跟踪其对象缓存中的工作集(给定节点上最常访问的文档)。所有 I/O 操作都作用于该内存缓存。对缓存中文档的更新最终会持久保存到磁盘上。此外,对于更新,锁定是在文档级别使用的,而不是在节点、数据库或分区级别(这会因大量 I/O 等待而影响吞吐量),也不是在字段级别(这会因为跟踪锁所需的内存和 CPU 周期而使系统陷入混乱)。

Couchbase 通过使用“仅附加”持久性来加速访问。这不仅用于数据,还用于索引。更新的信息永远不会被覆盖;相反,它被附加到正在修改的任何数据结构的末尾。此外,删除的空间可以通过压缩来回收,该操作可以安排在活动较少的时候进行。仅附加存储可加快更新速度,并允许在写入时进行读取操作。

Couchbase 扩展和复制为了促进水平扩展,Couchbase 使用哈希分片,确保数据在所有节点上均匀分布。系统定义了 1,024 个分区(固定数量),一旦文档的键被散列到特定分区中,该分区就是文档所在的位置。在 Couchbase Server 中,用于分片的密钥是文档 ID,这是自动生成并附加到每个文档的唯一标识符。每个分区都分配给集群中的特定节点。如果添加或删除节点,系统会通过将分区从一个节点迁移到另一节点来重新平衡自身。

Couchbase 系统中不存在单点故障。 Couchbase 集群中的所有分区服务器都是平等的,每个分区服务器仅负责分配给它的那部分数据。集群中的每个服务器都运行两个主要进程:数据管理器和集群管理器。数据管理器处理分区中的实际数据,而集群管理器主要处理节点内操作。

文档复制增强了系统弹性。集群管理器进程协调复制数据与远程节点的通信,并且数据管理器进程管理集群已分配给本地节点的任何副本数据。当然,副本分区分布在整个集群中,因此分区的副本永远不会与活动分区位于同一物理服务器上。

与文档本身一样,副本也以存储桶为基础存在——存储桶是 Couchbase 中的主要存储单元。文档被放入桶中,从索引和查询操作的角度来看,一个桶中的文档与其他桶中的文档是隔离的。创建新存储桶时,系统会要求您指定要为该存储桶创建的副本数量(最多三个)。如果服务器崩溃,系统将检测到崩溃,找到崩溃系统上的文档副本,并将这些副本提升为活动状态。系统维护一个集群映射,它定义了集群的拓扑,并且会根据崩溃进行更新。

请注意,此方案依赖于胖客户端(体现在应用程序用于与 Couchbase 通信的 API 库中),它们与服务器节点持续通信。这些胖客户端将获取更新的集群映射,然后重新路由请求以响应更改的拓扑。此外,胖客户端还参与对数据库的负载平衡请求。提供负载平衡所做的工作实际上分布在智能客户端之间。

拓扑的变化由协调器协调,协调器是被选为集群配置更改的单一仲裁者的服务器节点。所有拓扑变化都会发送到集群中的所有节点;即使协调器节点出现故障,也可以选举一个新节点担任该位置,并且系统运行可以不间断地继续。

Couchbase 支持跨数据中心复制 (XDCR),它可以将一个 Couchbase 集群的数据库内容实时复制到地理上远程的集群。请注意,XDCR 与集群内复制(将活动文档复制到其他集群成员上的非活动副本副本)同时运行,并且 XDCR 安排中的所有系统都以无形的方式相互同步。但是,Couchbase 不为 XDCR 安排提供自动故障转移,而是依赖于使用负载平衡机制等技术在网络层重新路由流量,在这种情况下,XDCR 组将在主-主配置中设置。

Couchbase 索引和查询Couchbase Server 上的查询是通过“视图”(Couchbase 索引术语)执行的。换句话说,当您创建索引时,您将获得一个视图,用作查询 Couchbase 数据的机制。视图是 Couchbase 2.0 的新功能,支持视图实际创建的增量 MapReduce 引擎也是如此。请注意,在 Couchbase Server 2.0 之前,查询实际上并不存在。在此最新版本之前,数据库是一个键/值存储系统,根本不理解多字段文档的概念。

要定义视图,您需要构建一种称为设计文档的特定类型文档。设计文档包含实现创建视图索引的mapreduce 操作的JavaScript 代码。设计文档绑定到特定的存储桶,这意味着查询不能跨多个存储桶执行。 Couchbase 的“最终一致性”在视图中也发挥着作用。如果您将新文档添加到存储桶或更新现有文档,更改可能不会立即可见。

设计文档的mapreduce 规范中的map 函数会从其执行的文档中过滤并提取信息。结果是一组包含查询加速索引的键/值对。减少功能是可选的。它通常用于聚合或求和映射操作所操纵的数据。 reduce 函数中的代码可用于实现大致对应于 SQL 的 ORDER BY、SORT 和聚合功能的操作。

Couchbase Server 提供内置的reduce 函数:_count、_stats 和_sum。这些内置函数的优化超出了从头开始编写的范围。例如,_count 函数(计算映射函数返回的行数)在调用时不必重新计算所有文档。如果向关联索引添加或删除项目,则计数会相应增加或减少,因此 _count 函数只需检索维护的值。

查询参数提供对索引的进一步过滤。例如,您可以使用查询参数来定义返回索引中的单个条目或指定范围的条目的查询。此外,在Couchbase 2.0中,文档元数据可用。在构建 MapReduce 函数时,此功能的用处变得显而易见,因为 Map 函数可以使用元数据根据过期日期和修订号等参数来过滤文档。

Couchbase 索引是增量更新的。也就是说,当更新索引时,它不会被大规模重建。更新仅涉及自上次更新索引以来已更改、添加或删除的文档。您可以将索引配置为在发生特定情况时更新。例如,您可以将索引配置为在针对索引发出查询时更新。然而,这在计算上可能会很昂贵,因此另一种方法是将索引配置为仅在视图中指定数量的文档被修改后才更新。还有另一种选择是根据时间间隔更新视图。

无论您选择哪种配置,重要的是要认识到设计文档可以包含多个视图,并且该配置适用于文档中的所有视图。如果更新一个索引,则文档中的所有索引都会更新。

最后,Couchbase 区分了开发视图和生产视图,并将两者保存在不同的命名空间中。开发视图可以修改;生产视图不能。造成这种区别的原因是,如果修改视图,则该设计文档中的所有视图都将失效,并且设计文档中由mapreduce函数定义的所有索引都将被重建。因此,开发视图使您能够在将视图代码部署到生产视图之前在某种沙箱中测试视图代码。

您可以通过基于 Web 的管理控制台来管理 Couchbase Server。如上所示,活动服务器的视图对集群的单个成员开放。内存缓存和磁盘存储使用信息随时可用。

管理 Couchbase为了收集统计数据和管理 Couchbase Server 集群,可以通过集群成员的端口 8091 上的任何现代浏览器使用 Couchbase Web 控制台。它提供了集群机制的多选项卡视图。这些选项卡包括:

  • 集群概览,其中包含一般 RAM 和磁盘使用信息(针对整个集群进行聚合)。此外,每秒操作数存储桶的使用情况。该信息以平滑滚动的线图形式呈现。
  • 服务器节点,提供与上述类似的信息,但针对集群的各个成员。您还可以查看 CPU 使用情况和交换空间使用情况。在此选项卡上,您可以向集群添加新节点:单击“添加服务器”按钮,系统将提示您输入 IP 地址和凭据。
  • 数据桶,显示集群上的所有桶。您可以查看哪些节点参与给定存储桶的存储、每个存储桶中有多少项目、归因于存储桶的 RAM 和磁盘使用情况等等。

Couchbase Web 控制台提供的信息比此处涵盖的信息要多得多。其功能的深入介绍可以在 Couchbase Server 的在线文档中找到。

对于更愿意在金属上执行管理职责的管理员,Couchbase 提供了一套健康的命令行工具。常规管理功能可在 couchbase-cli 工具中找到,该工具列出集群中的所有服务器、检索单个节点的信息、启动重新平衡、管理存储桶等。 cbstats 命令行工具显示集群统计信息,并且可以获取单个节点的统计信息(获取的统计信息种类繁多,此处无法列出)。 cbepctl 命令允许您修改集群的 RAM 和磁盘管理特性。例如,您可以控制“检查点”设置,该设置控制复制发生的频率。

其他命令行工具包括数据备份和恢复、从(无论出于何种原因)停止运行的节点检索数据的工具,甚至是在集群成员上生成 I/O 工作负载以测试其性能的工具。

Couchbase Server 提供企业版和社区版。企业版经过了比社区版更彻底的测试,并且收到了最新的错误修复。此外,还提供热修复以及 24/7 支持(购买年度订阅)。尽管如此,企业版可以免费在任意数量的节点上进行测试和开发,或者在最多两个节点上进行生产使用。正如您可能猜到的那样,社区版对于任意数量的生产节点都是免费的。

  • 提供旧版 Memcached 功能
  • 支持空间数据和视图
  • 现在是一个真正的文档数据库
  • 索引机制尚未完善
  • JSON支持还比较不成熟
  • 不支持范围分片

MongoDB 已有大约三年的历史,于 2009 年底首次发布。MongoDB 背后的目标是创建一个提供高性能的 NoSQL 数据库,并且没有放弃使用 RDBMS 的优点。例如,MongoDB 中查询的设计和优化方式与 RDBMS 中的设计和优化方式类似。 MongoDB 的设计者还希望让应用程序开发人员更容易使用数据库,例如,允许开发人员快速更改数据模型。 MongoDB 的名称是“humongous”的缩写,它以 BSON(二进制 JSON)存储文档,BSON 是 JSON 的扩展,允许使用整数、日期和字节数组等数据类型。

MongoDB 系统中有两个主要进程在工作:mongod 和 mongos。 mongod 进程是真正的主力。在分片 MongoDB 集群中,mongod 扮演着两个角色之一:配置服务器或分片服务器。配置服务器跟踪集群的元数据。 (在分片 MongoDB 集群中,为了冗余起见,必须至少有三个配置服务器。)每个配置服务器都知道集群中的哪台服务器负责给定文档,或者更准确地说,知道给定的连续分片键范围(称为块)属于集群中的位置。

集群中的其他 mongod 进程作为分片服务器运行,它们处理数据的实际读写。出于故障转移的目的,给定集群成员上的 mongod 进程的两个实例作为分片服务器运行。一个过程是主要的,另一个过程是次要的。所有写请求都发送到主服务器,而读请求可以发送到主服务器或辅助服务器。

辅助节点与主节点异步更新,以便在主节点崩溃时它们可以接管。然而,这意味着某些读取请求(发送到辅助节点)可能与写入请求(发送到主节点)不一致。这是 MongoDB 的“最终一致性”的一个实例。随着时间的推移,所有辅助节点将与主节点上的写入操作保持一致。请注意,您可以通过配置 MongoDB 系统来保证一致的读/写行为,以便所有 I/O — 读取写入 — 转到主实例。在这种安排中,辅助服务器充当备用服务器,仅在主服务器发生故障时才联机。

mongos 进程在概念上比 mongod 进程运行在更高的级别,最好将其视为一种路由服务。来自客户端的数据库请求首先到达 mongos 进程,该进程确定分片集群中的哪个分片可以为每个请求提供服务。 mongos 进程将 I/O 请求分派到适当的 mongod 进程,收集结果并将其返回给客户端。请注意,在非分片集群中,客户端直接与 mongod 进程对话。

MongoDB 扩展和复制MongoDB 没有显式的内存缓存层。相反,所有 MongoDB 操作都是通过内存映射文件执行的。因此,MongoDB 将内存缓存与磁盘持久化之间的繁琐工作交给了操作系统。不过,您可以调整各种刷新到磁盘设置以获得最佳性能。例如,MongoDB 维护数据库操作日志(用于恢复目的),每 100 毫秒刷新到磁盘。该间隔不仅是可配置的,而且您还可以配置系统,以便写操作仅在日志写入磁盘后返回。

文档放置在称为集合的命名容器中,大致相当于 Couchbase 的存储桶。集合用作将相关文档划分为不同组的一种方法。 MondoDB 数据库中许多多文档操作的影响仅限于执行这些操作的集合。 MongoDB 支持集合级别的分片,这意味着(如果要求规定)您可以使用未分片和分片集合构建数据库。当然,只有分片集合才能防止单点故障。

文档在特定分片中的成员身份由分片键确定,该分片键源自每个文档中的一个或多个字段。确切的字段可以由数据库管理员指定。此外,MongoDB 提供自动分片,这意味着,一旦配置了分片,MongoDB 将自动管理文档在适当物理位置的存储。这包括随着文档数量的增长或 mongod 实例数量的变化重新平衡分片。

从 2.4 版本开始,MongoDB 支持基于哈希的分片和基于范围的分片。正如您可能猜到的那样,基于哈希的分片对分片键进行哈希处理,从而在集群中创建相对均匀的文档分布。使用基于范围的分片(2.4 之前的唯一分片类型),MongoDB 分片集群的给定成员将存储分片键整个域的给定子范围内的所有文档。更准确地说,MongoDB 定义了一个逻辑容器,称为块,它是分片键落在特定范围内的文档的子集。然后 mongos 进程指示哪个 mongod 进程将管理给定的块。

通常,您允许负载均衡器确定哪个集群成员管理给定的分片范围。但是,在 2.4 版本中,您可以将标签与分片范围关联起来(标签只不过是一个标识字符串)。完成后,您可以指定集群的哪个成员将管理与标签关联的任何分片范围。从某种意义上说,这使您可以覆盖负载均衡器的某些决策并将数据库的可识别子集引导到特定服务器。例如,您可以将加利福尼亚州最常访问的数据放在加利福尼亚州的集群成员上,将德克萨斯州最常访问的数据放在德克萨斯州的集群成员上,依此类推。

MongoDB 的锁定是在数据库级别的,而在 2.2 版本之前它是全局的。系统实现共享读、独占写锁定(许多并发读取者,但只有一名写入者),并且等待写入者的优先级高于等待读取者。 MongoDB 通过锁内的收益操作来避免争用。 2.2版本中添加了预测编码;如果一个进程请求一个不在内存中的文档,它就会释放自己的锁,以便为其他进程(其文档在内存中)提供服务。长时间运行的操作也会定期产生锁。

您会发现 MongoDB 中没有明确的事务概念。当然,您无法在 MongoDB 安装上执行纯 ACID 事务。如果启用日记功能,数据库更改可以持久化,在这种情况下,写操作将被阻止,直到日记条目持久保存到磁盘(如前所述)。 MongoDB 定义了 $atomic 隔离运算符,它对所涉及的文档施加了相当于独占写锁的操作。但是,$atomic 仅适用于文档级别。您无法保护跨文档或集合的多个更新。

MongoDB 索引和查询MongoDB 可以轻松地为所有文档字段创建二级索引。主索引始终存在于文档 ID 上。与 Couchbase Server 一样,这是为每个文档自动生成的。但是,使用 MongoDB,您可以指定一个单独的字段作为文档的唯一标识符。例如,银行帐户数据库可能会使用银行生成的帐号作为文档 ID 字段。索引存在于集合级别,并且它们可以是复合的,即在多个字段上创建。 MongoDB 还可以处理多键索引。如果您索引包含数组的字段,MongoDB 将索引该数组中的每个值。最后,MongoDB 支持地理空间索引。

MongoDB 的查询能力非常发达。如果您是从 RDBMS 世界转向 MongoDB 的,在线文档将展示如何将 SQL 查询映射到 MongoDB 操作。例如,在大多数情况下,可以通过 find() 函数执行 SQL 的 SELECT 的等效操作。 find() 函数有两个参数:查询文档和投影文档。查询文档指定对所获取的特定文档字段的过滤操作。您可以使用它来请求仅返回数量字段内容大于(例如 100)的文档。因此,查询文档对应于SQL语句中的WHERE子句。投影文档标识要在结果中返回哪些字段,这允许您请求仅从查询中返回匹配文档的名称和地址字段。 sort() 函数可以对find() 的结果执行,对应于SQL 的ORDER BY 语句。

您可以使用命令 db 来定位文档。<collection> .find(),可能是您可以执行的最简单的查询。 find() 命令将返回结果的前 20 个成员,但它还提供了一个游标,允许您迭代集合中的所有文档。如果您想更直接地导航结果,可以像引用数组一样引用光标的元素。

由于 MongoDB 的前缀运算符集可以描述比较以及布尔连接,因此可以进行更复杂的查询。如果您想将正则表达式应用于结果集中的文档字段,MongoDB 还提供 $regex 运算符。这些前缀运算符可在 update() 命令中使用,以构造与 SQL 的 UPDATE … WHERE 语句等效的 MongoDB。

在 2.2 版本中,MongoDB 添加了聚合框架,该框架允许计算聚合值,而不必求助于 MapReduce(如果您只想计算字段的总计或平均值,这可能有点过大)。聚合框架提供类似于 SQL 的 SUM 和 AVG 函数的功能。它还可以计算计算字段并模仿 GROUP BY 运算符。请注意,聚合框架是声明性的 - 它不使用 JavaScript。您定义一系列操作,与执行 Unix/Linux shell 编程的方式非常相似,并且这些操作以流方式在目标文档上执行。

MongoDB 2.4 版本中最重要的新功能之一是文本搜索的到来。过去,开发人员通过将 Apache Lucene 与 MongoDB 集成来实现这一目标,这会带来相当大的复杂性。在具有复制和容错能力的集群系统中添加Lucene并不是一件容易的事情。 MongoDB 用户现在可以免费获得文本搜索。新的文本搜索功能并不是为了匹配 Lucene,而是提供基本功能,例如更高效的布尔查询(“狗和猫,但不是鸟”)、词干提取(搜索“reading”,您也会得到“read”)以及从索引中自动剔除停用词(例如“and”、“the”、“of”)。

您可以在多个字符串字段上定义文本索引,但每个集合只能有一个文本索引,并且索引不存储单词邻近信息(即单词彼此之间的接近程度,这可能会影响匹配的加权方式)。此外,文本索引是完全一致的:当您更新数据时,索引也会更新。

2.4 版本中还添加了易用性功能。例如,您现在可以将“上限数组”定义为数据元素,其工作原理有点像有序循环缓冲区。例如,如果您要跟踪博客中的前 10 个条目,则使用上限数组将允许您添加新条目,并且(根据指定的顺序)以前的条目将被删除,以将数组上限限制为 10 或您指定的任何数字。

MongoDB 2.4 还改进了地理空间功能。例如,您现在可以执行多边形操作,这将允许您确定两个区域是否重叠。 2.4中使用的球形模型也得到了改进;现在考虑到地球不是完美的球形这一事实,因此距离计算更加准确。

MongoDB 映射缩减在Couchbase Server中,mapreduce操作的主要工作是为数据库中的文档提供结构化查询和信息聚合功能。在MongoDB中,mapreduce不仅可以用于查询和聚合结果,还可以作为通用的数据处理工具。正如 MapReduce 操作在 Couchbase Server 中的给定存储桶中执行一样,MapReduce 在 MongoDB 数据库中的给定集合中执行。与 Couchbase Server 一样,MongoDB 中的 mapreduce 函数是用 JavaScript 编写的。

您可以通过比较运算符过滤传递到映射函数的文档,也可以将文档数量限制为特定数量。这允许您创建相当于增量映射缩减操作。最初,您对整个集合运行 mapreduce。对于后续执行,您添加一个仅包含新添加的文档的查询函数。从那里,将 mapreduce 的输出设置为单独的集合,并配置代码,以便将新结果合并到现有结果中。

通过选择是否将中间结果(map 函数的输出,发送到reduce 函数)转换为 BSON 对象还是保留 JavaScript 对象,可以进一步权衡速度/大小。如果您选择 BSON,BSON 对象将放置在临时磁盘存储中,因此您可以处理的项目数量仅受可用磁盘空间的限制。但是,如果您选择 JavaScript 对象,则系统只能处理由映射函数发出的大约 500,000 个不同的键。但由于没有写入磁盘,处理速度更快。

您必须小心长时间运行的 MapReduce 操作,因为它们的执行涉及长时间的锁。如前所述,系统具有内置设施来缓解这种情况。例如,输入集合上的读锁每 100 个文档就会生成一次。 MongoDB 文档描述了必须考虑的各种锁,以及缓解可能问题的机制。

管理 MongoDBMongoDB 数据库的管理访问通过交互式 mongo shell 进行。它基本上是一个命令行界面,可以让您输入任意 JavaScript,但它仍然非常简单。 MongoDB 相关命令并不复杂,但如果你不小心,就会很危险。例如,要选择数据库,请输入 use<databasename> 。但该命令不会检查特定数据库是否存在;如果您输入错误并继续将文档输入该数据库,您可能不知道发生了什么,直到您将大量文档放入错误的位置。数据库内的集合也是如此。

其他有用的命令行实用程序是 mongostat,它返回有关特定时间段内的操作数量(插入、更新、删除等)的信息。 mongotop 实用程序同样返回 MongoDB 实例的统计信息,这次侧重于特定集合。例如,您可以查看在集合中阅读或写作所花费的时间。

此外,10gen还提供免费的基于云的MongoDB监控服务(MMS),它为 MongoDB 安装提供监控仪表板。 MMS 基于 SaaS 模型构建,要求您在 MongoDB 集群上运行一个小型代理来与管理系统进行通信。

10gen 的 MongoDB 监控服务显示统计信息(在本例中为副本集),但数据库的管理是通过命令行完成的。

除了上面讨论的新文本搜索和地理空间功能之外,MongoDB 2.4 还带来了性能和安全性改进。性能增强包括工作集分析器。这个想法是,您希望配置系统,以便工作集(访问最频繁的数据库子集)完全适合内存。但要弄清楚您的工作集或需要多少内存并不容易。工作集分析器的运行方式类似于辅助功能,它提供诊断输出,帮助您发现工作集的特征并相应地调整系统。此外,JavaScript引擎已被Google开源的V8引擎取代。过去,JavaScript 引擎是单线程的。 V8 允许并发 MapReduce 作业,并提高总体速度。

最后,企业版欢迎基于 Kerberos 的身份验证。在所有版本中,MongoDB 现在都支持基于角色的权限,这使您可以更细粒度地控制用户对数据库和集合的访问和操作。

10gen 发布 MongoDB 2.4 时附带了新的订阅级别:社区、基础、标准和企业。社区订阅级别是免费的,但也免费提供任何支持。其他订阅级别提供不同的支持响应时间和可用时间。此外,企业订阅级别附带企业版MongoDB,它具有更多安全功能和SNMP支持。它还经过了更严格的测试。

  • 新版本包含文本搜索
  • 新版本添加了改进的 JavaScript 引擎
  • 10gen 提供免费 MongoDB 培训课件
  • 文本索引不存储邻近信息
  • 没有基于 GUI 的管理控制台
  • Kerberos 身份验证仅在企业版中可用

Mongo 还是 Couch?像往常一样,哪种产品是最佳选择在很大程度上取决于目标应用程序。两者都是备受推崇的 NoSQL 数据库,具有杰出的血统。一方面,MongoDB 在其生命周期中的大部分时间都作为文档数据库,其对文档级查询和索引的支持比 Couchbase 更丰富。另一方面,Couchbase 可以同样充当文档数据库、Memcached 替代品或两者兼而有之。

令人高兴的是,探索 Couchbase 或 MongoDB 都非常简单。任一数据库服务器的单节点系统都很容易安装。如果您想尝试分片系统(并且有足够的内存和处理器能力),您可以轻松地在单个系统上设置一组虚拟机,并通过虚拟网络交换机将它们连接在一起。这两个系统的文档数量庞大且维护良好。 10Gen甚至提供为开发人员提供免费在线 MongoDB 课程,配有视频讲座、测验和作业。

本文, ”NoSQL 对决:MongoDB 与 Couchbase,”最初发表于信息世界网。关注最新动态应用开发,数据管理,云计算,并在 InfoWorld.com 上开源。了解最新商业科技新闻,关注Twitter 上的 InfoWorld.com

阅读有关数据管理的更多信息在 InfoWorld 的数据管理频道中。