【文档数据库】ES和MongoDB的对比

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 【文档数据库】ES和MongoDB的对比

1.由文档存储牵出的问题

本文或者说关于mongodb的这个系列文章的源头:

前面我们聊过了分布式链路追踪系统,在基于日志实现的分布式链路追踪的方式seluth+zipkin中为了防止数据丢失,需要将数据持久化。我们给出的是持久化进mysql中的示例。

聊完ES后,这时候我们难免就避不开mongodb这个热门的文档数据库,什么是MongoDB,MongoDB的核心概念,ES和MongoDB的对比,将会是本文的核心内容。

2.什么是MongoDB?

MongoDB(由“Humongous Database”缩写而来)是一种开源的、面向文档的 NoSQL 数据库系统,自4.0版本开始支持ACID。它在设计上采用了分布式文件存储的思想,适用于大规模数据的存储和处理。

说的直白点,MongoDB在设计的时候就是冲着解决海量文档的存储来的。

mongodb的架构如下:

database(数据库):数据库是一个仓库,里面可以存放集合。

collection(集合):类似于数组,可以在集合中存放文档。

document(文档):mongodb最小的单位,我们存储和操作的内容都是文档。

数据库类比数据库,集合类比表,文档类比一条数据。

数据库和集合都不需要我们手动创建,当我们创建文档时,文档所在的数据库或者集合不存在,会自动创建数据库和集合。

mongodb的数据结构:


MongoDB的数据结构是其用来应对海量文档存储的核心,其是以类JSON的方式来存储数据,也就是BSON。BSON是二进制的,这样做的目的是为了增强存储能力,具体的细节后文说。先来看看JSON和BSON的比较:


假设我们有如下的 JSON 对象,用于描述一个人的基本信息:


这个 JSON 对象包含了一些基本的数据类型,如字符串、数字、布尔值、对象和数组。

{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "birthday": "1990-01-01",
  "address": {
    "street": "123 Main St",
    "city": "Anytown"
  },
  "hobbies": ["reading", "cycling"]
}
 

现在,我们将同样的数据转换为 BSON 格式。在 BSON 中,我们可以使用一些 JSON 中不存在的数据类型。以下是 BSON 版本的同一数据,包含一些 BSON 特有的字段(请注意,这是概念性的表示,因为 BSON 实际上是二进制格式,无法以纯文本形式直观展示):

{
  "name": "John Doe",                // 字符串
  "age": Int32(30),                  // 32位整数
  "isStudent": false,                // 布尔值
  "birthday": ISODate("1990-01-01"), // 日期类型
  "address": {                       // 嵌套文档
    "street": "123 Main St",
    "city": "Anytown"
  },
  "hobbies": ["reading", "cycling"]// 数组
}
 

在这个 BSON 示例中,我们可以看到一些与 JSON最大的不同就是其数据是有类型的,BSON最是二进制的,有类型声明这样能准确的从二进制里解析出准确的值来,从而避免了还要转一遍的这种解析过程。所有我们可以看到BSON是很适合用来进行文档存储的,二进制化后减小了原始数据的体积,又由于有类型的存在,能直接读出来,又很适合检索。

3.ES和MongoDB的对比

其实到这里很多人都会有疑惑,ES和MongoDB都能存储海量文档,都支持文档的搜索,很多功能上都是高度重合的,那为什么会出现如此相似的两个东西?他们各自的应用场景有什么不同?

首先我们要知道:

全文搜索和文档存储在某种程度上可以被视为对立的或至少是有着不同优化方向的技术,也就是说二者是不能相互兼顾的,只能二选一。

  1. 全文搜索的特点:
  • 全文搜索的核心在于能够快速有效地检索出包含特定词汇或词组的文档。
  • 为此,搜索引擎(如 Elasticsearch)建立复杂的索引来存储每个词汇的出现位置、频率等信息。
  • 这些索引通常需要快速访问,因此搜索引擎可能会牺牲一些存储效率来提高读取速度。
  1. 文档存储的特点:
  • 文档存储(如 MongoDB)主要关注于存储和查询结构化或半结构化数据。
  • 这些系统可能采用不同的存储优化技术,如数据压缩、分片等,以提高存储效率和处理大量数据的能力。
  • 文档数据库的索引通常不是为了全文搜索设计的,而是为了快速查找特定字段或数据结构。
  1. 优化方向的差异:
  • 全文搜索引擎的设计重点在于最大化检索效率,特别是在处理大量文本数据时的搜索性能。
  • 文档数据库则更侧重于数据的灵活性、存储效率和结构化查询的性能。

OK,到这里其实我们就已经知道了ES和MongoDB最核心的区别了,也就不会疑惑。也可以得出:

es拥有更细粒度的查询能力,也就是能对全文进行各种检索,但在文档的存储上要差一点。

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
目录
相关文章
|
5天前
|
NoSQL 关系型数据库 MySQL
|
11天前
|
NoSQL JavaScript 安全
精心操作MongoDB:删除数据库的关键步骤和重要事项
精心操作MongoDB:删除数据库的关键步骤和重要事项
|
11天前
|
NoSQL 测试技术 MongoDB
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
|
11天前
|
存储 NoSQL 数据处理
探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践
探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践
|
13天前
|
存储 缓存 NoSQL
MongoDB数据库的主要应用场景是什么?
【6月更文挑战第5天】MongoDB数据库的主要应用场景是什么?
52 1
|
13天前
|
存储 NoSQL MongoDB
MongoDB数据库
【6月更文挑战第5天】MongoDB数据库
40 1
|
14天前
|
存储 数据采集 NoSQL
DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
【6月更文挑战第4天】DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
84 1
|
20天前
|
NoSQL MongoDB 数据库
使用MongoDB进行NoSQL数据库管理
【5月更文挑战第29天】MongoDB是流行的NoSQL数据库,以其文档存储、动态模式、高性能和丰富查询功能著称。它采用BSON格式,支持灵活的数据结构。基本操作包括安装、连接、创建数据库和集合、插入/查询/更新/删除文档。最佳实践涉及合理设计数据模型、使用索引、监控调优、备份恢复及确保安全性。MongoDB为复杂应用提供了高效的数据管理解决方案。
|
1月前
|
存储 SQL NoSQL
什么是 MongoDB,为什么它是当今最受欢迎的数据库之一?
什么是 MongoDB,为什么它是当今最受欢迎的数据库之一?
|
1月前
|
JSON NoSQL MongoDB
理解Nosql数据库的mongodb
【5月更文挑战第5天】MongoDB是2009年发布的一款通用型NoSQL数据库,结合了关系模型和NoSQL的优点,适用于各种现代应用。其特点包括图形界面、数据服务、云基础设施集成(AWS, Azure, Google Cloud)。它具备全面的查询能力、ACID事务、可调整的一致性保证,并有多语言驱动及工具,可在任何地方运行。
209 4

热门文章

最新文章