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

目录

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

2.什么是MongoDB?

3.ES和MongoDB的对比


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

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

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

【JAVA】分布式链路追踪技术概论-CSDN博客

https://bugman.blog.csdn.net/article/details/135258207?spm=1001.2014.3001.5502

后面我们发现存放日志以及需要进行后期统计这个场景来说的话关系型数据库是不合适的,于是引出了用ES系列:

https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502

https://bugman.blog.csdn.net/article/details/135425284?spm=1001.2014.3001.5502

https://bugman.blog.csdn.net/article/details/135515805?spm=1001.2014.3001.5502

https://bugman.blog.csdn.net/article/details/135581380?spm=1001.2014.3001.5502

聊完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都能存储海量文档,都支持文档的搜索,很多功能上都是高度重合的,那为什么会出现如此相似的两个东西?他们各自的应用场景有什么不同?

首先我们要知道:

ES的核心是冲着全文检索去的,MongoDB的核心是冲着文档存储去的。

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

  1. 全文搜索的特点:

    • 全文搜索的核心在于能够快速有效地检索出包含特定词汇或词组的文档。
    • 为此,搜索引擎(如 Elasticsearch)建立复杂的索引来存储每个词汇的出现位置、频率等信息。
    • 这些索引通常需要快速访问,因此搜索引擎可能会牺牲一些存储效率来提高读取速度。
  2. 文档存储的特点:

    • 文档存储(如 MongoDB)主要关注于存储和查询结构化或半结构化数据。
    • 这些系统可能采用不同的存储优化技术,如数据压缩、分片等,以提高存储效率和处理大量数据的能力。
    • 文档数据库的索引通常不是为了全文搜索设计的,而是为了快速查找特定字段或数据结构。
  3. 优化方向的差异:

    • 全文搜索引擎的设计重点在于最大化检索效率,特别是在处理大量文本数据时的搜索性能。
    • 文档数据库则更侧重于数据的灵活性、存储效率和结构化查询的性能。

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

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

MongoDB在文档的存储上更优秀,适合存储海量文档,但是只支持简单的文档搜索,而不是全文检索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/411475.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业如何在新媒体领域做好风险管理?

为了企业能更加放心地进行新媒体营销活动,矩阵通向企业提供一套完整的新媒体风险管控机制,支持企业新媒体矩阵账号体检、敏感内容违规检测、实时监测多平台负面用户信息。 矩阵通是新榜旗下的新媒体数字化内容资产管理SaaS,可以帮助企业解决跨…

Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级

文章目录 Resilience4j概述Resilience4j官方地址Resilience4j-RateLimiter微服务演示Payment processorPOM配置文件ServiceController Payment servicePOMModelServiceRestConfigController配置验证 探究 Rate Limiting请求三次 ,观察等待15秒连续访问6次 Resilienc…

Spring MVC学习之——RequestMapping注解

RequestMapping注解 作用 用于建立请求URL和处理请求方法之间的对应关系。 属性 value:指定请求的实际地址,可以是一个字符串或者一个字符串列表。 value可以不写,直接在括号中写,默认就是value值 RequestMapping(value“/hel…

【树莓派】网线远程连接电脑和树莓派,实现SSH连接

目录 1、硬件连接; 2、电脑端: 3、查找树莓派的IP地址 4、开启树莓派的SSH接口 5、putty 6、命令行 参考文章 通过网线连接笔记本与树莓派 开启SSH和VNC功能 无显示器安装树莓派 实现:打开putty输入树莓派地址使用ssh方式登陆&…

Verilog刷题笔记17

题目: For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*) Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but …

Qt/QML编程之路:小键盘keyboard(36)

小键盘对于qml应用是经常用到的,在qml里面,就如一个fileDialog也要自己画一样,小键盘keyboard也是要自己画的,对于相应的每个按键的clicked都要一一实现的。 这里有一个示例: 代码如下: import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Window 2.0 im…

【VRTK】【QA】总是报Axis定义缺失怎么办?

【背景】 新建一个VRTK编写的项目后,运行时总是报如下错误: 【分析】 在Project Settings中有定义Input的部分,根据报错,应该是在Input定义设置中缺少了相应的Axis设置。进去设置一看果真如此,没有任何Tilia相关的…

AndroidStudio下载安装教程

下载链接:官方下载 https://developer.android.google.cn/studio?hlzh-cn点击后弹出条款及条件页面,往下滑,勾选同意,然后就点击下载,等待下载完成 下载完成后双击打开,Next 继续Next 选择安装路径&am…

基于opencv的大米计数统计(详细处理流程+代码)

在我每周的标准作业清单中,有一项是编写计算机视觉算法来计算该图像中米粒的数量: 因此,当我的一个好朋友M给我发了一张纸上的扁豆照片(显然是受到上述转发的启发),请我帮他数一下谷物的数量时,…

new Handler(getMainLooper())与new Handler()的区别

Handler 在Android中是一种消息处理机制。 new Handler(); 创建handler对象,常用在已经初始化了 Looper 的线程中调用这个构造函数(即非主线程),如果感觉不好理解,可以把Handler handler new Handler() 理解为常用在…

【C++】异常机制

异常 一、传统的处理错误的方式二、C异常概念三、异常的使用1. 异常的抛出和捕获(1)异常的抛出和匹配原则(2)在函数调用链中异常栈展开匹配原则 2. 异常的重新抛出3. 异常安全4. 异常规范 四、自定义异常体系五、C 标准库的异常体…

JVM工作原理与实战(十五):运行时数据区-程序计数器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、程序计数器 总结 前言 JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供…