MongoDB最常见问题

在开始讲“MongoDB 不是什么之前,我们来总结一下 MongoDB 到底是什么。
MongoDB
是一个分布式文档数据库。集群 (我们称之为复本集) 大多是自我管理的——当集群中的每台机器都知道了其他服务器的所在,如果其中一个节点宕机或网络出现问题,它们会自动加以处理。如果其中一台机器被关闭或发生崩溃,其他机器会接管。要实现仲裁,群集中至少需要有 3 个节点。集群中的每台服务器都有数据库所有数据的完整副本。

集群是为了冗余,而不是为了可伸缩性。所有的客户端通常只连接到一台服务器——被选举出来的主服务器,它负责执行查询和更新,并将数据变更传输到备用机器。
你可以直接连接到备用服务器做一些有趣的事情,比如运行分析查询。但一般来说,直接连接到备用节点意味着你可能会遇到一些旧数据,所以不应该连接到备用节点,除非你可以接受旧数据。
讲完分布式,接下来讲讲文档数据库
MongoDB
与传统关系型数据库的不同之处在于,它不是将数据保存成扁平的行,然后存储在数据库的表中,而是在文档中存储分层结构的数据——基本上与 JSON 对象类似。文档存储在集合中,集合实际上就是一堆文档。每个文档可以具有与集合中其他文档不同的结构或模式。你还可以(而且应该)根据将要运行的查询类型和存储数据对集合中的文档进行索引。如果你想要确保集合中的所有文档都遵循一种结构,可以将 JSON 模式应用于集合,作为验证器。

你肯定听说过 MongoDB 是一个 JSON 数据库的说法,特别是如果你最近访问过 MongoDB 的主页。

不过,正如前面提到的,MongoDB 不是一个 JSON 数据库。它支持额外的数据类型,比如对象、原生日期对象、更多的数字类型、地理原语和高效的二进制类型等等。
MongoDB
实际上是一个 BSON 数据库。
这似乎是一个微不足道的区别,但却很重要。与基于文本的格式相比,它在存储、传输和遍历方面更高效,而且比 JSON 支持更多的数据类型。
MongoDB
存储的是 BSON 文档
用于查找的实际上也是 BSON 文档
结果以 BSON 文档的形式输出
BSON
甚至是 MongoDB 的有线协议
如果你习惯了使用 JSON,可以将 MongoDB 看成是 JSON 数据库,这就是为什么我们有时会这样描述它!等你使用 MongoDB 一段时间,就会开始对 BSON 的优势大加赞许。

迷思:MongoDB 不支持事务
一些第三方文章将 MongoDB 描述成 BASE 数据库。BASE 是指基本可用、软状态、最终一致
但这不是真的,从来都不是!MongoDB 从来都不是最终一致的。对主文档的读写是强一致性的,对单个文档的更新始终是原子的。软状态是指需要持续不断的更新数据,否则数据就会过期,但 MongoDB 并非如此。
最后,如果太多的节点不可用,无法达成仲裁,MongoDB 将进入只读状态(降低可用性)。这是有意这么设计的,因为这样可以确保在出现问题时保持一致性。
MongoDB
是一个 ACID 数据库。它支持原子性、一致性、隔离性和持久性。
对单个文档的更新始终是原子的,从 4.0 版本开始,MongoDB 也支持跨多个文档和集合的事务。从 4.2 开始,甚至支持分片集群的跨分片事务。
虽然 MongoDB 支持事务,但在使用它时仍然要谨慎。事务是以性能为代价的,而且由于 MongoDB 支持丰富的分层文档,如果你的模式设计正确,就没有必要经常跨多个文档更新数据。

网友评论

0条评论

发表

网友评论

0条评论

发表

最新评论

推荐文章

彩龙

Copyright © 2008-2020 彩龙社区(https://www.clzg.cn) 版权所有 All Rights Reserved.

免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。

经营许可证编号:滇B2-20090009-7

下载我家昆明APP 下载彩龙社区APP