MongoDB 最常见的 10 个错误说法

作者 | Mark Smith
【MongoDB 最常见的 10 个错误说法】译者 | 王者
策划 | 万佳
我加入 MongoDB 还不到一年,但学到了很多东西 。在面试这家公司前,我从未真正使用过 MongoDB,尽管我听过一些有关它的演讲,并且它的简单易用给我留下深刻印象 。
但和大多数人一样,我也听说过这些可怕的说法:“它不支持关系模型 。如果你想存储文档,那没问题,但如果以后想要进行聚合该怎么办?你将被困在这个错误的数据库里!而且不管怎样,它不支持事务!”
当我开始查找这些信息的来源,才意识到两个问题:首先,这些帖子大多是十年前的,所以他们所说的是一个刚刚推出三年的产品,而不是今天这个成熟、经过实战考验的数据库 。其次,他们说的几乎都不再是对的,而且在某些情况下从来都没有对过 。
所以我决定做一个演讲(并写了这篇文章)来逐一澄清这些错误的说法 。
1
迷思 0:MongoDB 是 Web 可伸缩的
YouTube 上有个视频,视频里有几只狗(看起来应该是狗吧?) 。你可能已经看到了——其中一只是盲目的新技术追随者,它盲目相信 MongoDB,没有真正加以了解 。另一只狗比较理性,第一只狗的盲从让它感到沮丧 。

MongoDB 最常见的 10 个错误说法

文章插图
在加入 MongoDB 第一天,我的一个朋友给我发了这个视频链接,但此前,我已经看过了 。看看日期,这段视频已经流传十多年了 。当时真的很有趣,但现在呢?里面几乎所有的东西都过时了 。
事实上,MongoDB 公司很多人的 T 恤或笔记本电脑贴纸上都有这个角色,它是 MongoDB 的非官方吉祥物 。
2
MongoDB 到底是什么?
在开始讲“MongoDB 不是什么”之前,我们来总结一下 MongoDB 到底是什么 。
MongoDB 是一个分布式文档数据库 。集群(我们称之为复本集)大多是自我管理的——当集群中的每台机器都知道了其他服务器的所在,如果其中一个节点宕机或网络出现问题,它们会自动加以处理 。如果其中一台机器被关闭或发生崩溃,其他机器会接管 。要实现仲裁,群集中至少需要有 3 个节点 。集群中的每台服务器都有数据库所有数据的完整副本 。
MongoDB 最常见的 10 个错误说法

文章插图
集群是为了冗余,而不是为了可伸缩性 。所有的客户端通常只连接到一台服务器——被选举出来的主服务器,它负责执行查询和更新,并将数据变更传输到备用机器 。
你可以直接连接到备用服务器做一些有趣的事情,比如运行分析查询 。但一般来说,直接连接到备用节点意味着你可能会遇到一些旧数据,所以不应该连接到备用节点,除非你可以接受旧数据 。
讲完“分布式”,接下来讲讲“文档数据库” 。
MongoDB 与传统关系型数据库的不同之处在于,它不是将数据保存成扁平的行,然后存储在数据库的表中,而是在文档中存储分层结构的数据——基本上与 JSON 对象类似 。文档存储在集合中,集合实际上就是一堆文档 。每个文档可以具有与集合中其他文档不同的结构或模式 。你还可以(而且应该)根据将要运行的查询类型和存储数据对集合中的文档进行索引 。如果你想要确保集合中的所有文档都遵循一种结构,可以将 JSON 模式应用于集合,作为验证器 。
上面的文档是一个例子,显示了 1893 年的一部电影的信息!文档是用PyMongo驱动程序获取的 。
注意,这里有些值是数组,比如“countries”和“cast”,而有些值是对象(我们称它们为子文档) 。这就是 MongoDB 文档的层次结构——它们不像关系数据库中的表行那样扁平 。
还需要注意的是,它还包含一个原生 Python datetime 类型的“released”字段,以及一个特殊的 ObjectId 类型的值 。或许这个不是真正意义上的 JSON 文档?我们待会再来说这个……
上面的文档是一个例子,显示了 1893 年的一部电影的信息!文档是用PyMongo驱动程序获取的 。
注意,这里有些值是数组,比如“countries”和“cast”,而有些值是对象(我们称它们为子文档) 。这就是 MongoDB 文档的层次结构——它们不像关系数据库中的表行那样扁平 。
还需要注意的是,它还包含一个原生 Python datetime 类型的“released”字段,以及一个特殊的 ObjectId 类型的值 。或许这个不是真正意义上的 JSON 文档?我们待会再来说这个……


推荐阅读