MongoDB~基础知识记录

为何要学Mongodb

工作以来,使用最多、了解最多的是MySQL。但技术的发展一定是依据痛点来的,就比如我遇到的痛点,一个业务、一个平台能力、存储的一个对象,随着产品和运营的需求,不断的进行变更,每一次的变更,我都得去写DDL语言,去改表,每一次的改表,都让我胆战心惊:

  • 会不会影响到其他逻辑?
  • SQL执行过程中会不会有其他的线上影响?
  • 改后的表如何兼容老逻辑?
  • 有哪些下游接了这个BD的binlog,对他们会不会有什么影响?
  • 考虑完上面,这些最后还得去改表、改代码、测试、灰度。。。。

所以学习Mongodb就是为了其的:高可扩展、高性能和高可用

虽然目前已经发展到7版本,但使用最多的是还是4开头的版本,再者是5开头的版本,在我眼里,主要原因还是4开头的版本支持了分布式的事务,能力已经足够,无需再去冒险升级扩展。
所以我学习的也是4.x版本。

简要

Mongodb是一个分布式的NoSQL存储系统,也就是非关系型的数据库,是文档数据库,可以直接理解为“是一个直接存储文档的数据库”,因为其的高性能、高扩展、高可用使用的场景大多还是web业务的系统。

基础概念

类似于MySQL中的数据库、表、行、列,在Mongodb里对一些对比,有助于快速理解
MongoDB 的存储结构区别于传统的关系型数据库,主要由如下三个单元组成:

  • 字段(Field):一个数据对象,对应的字段,可以理解为MySQL中的一列(Col)
  • 文档(Document) :MongoDB 中最基本的单元,由 BSON 键值对(key-value)组成,类似于关系型数据库中的行(Row)。
  • 集合(Collection) :一个集合可以包含多个文档,类似于关系型数据库中的表(Table)。
  • 数据库(Database) :一个数据库中可以包含多个集合,可以在 MongoDB 中创建多个数据库,类似于关系型数据库中的数据库(Database)。

文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。

  • 键不能含有 \0(空字符)。这个字符用来表示键的结尾。
  • . 和 $ 有特别的意义,只有在特定环境下才能使用。
  • 以下划线_开头的键是保留的(不是严格要求的)。

集合不需要事先创建,当第一个文档插入或者第一个索引创建时,如果该集合不存在,则会创建一个新的集合。

Mongodb基本特点及其原理

模式自由、高扩展性

在Mongodb里,一个对象被存储为一个文档,本质是一个bson的数据。多个文档组成一个集合,类似MySQL里的表,但该集合没有schema限制,不需要定义,随存随扩展。

Bson 数据,是 JSON 文档的二进制表示。

Bson与JSON

Json本质就是一个字符串,如何对其里面的某一个字段进行查找和修改会非常痛苦,很耗时,所以bson就将字段进行拆分,为每一个字段存储一个其长度,以助于知道长度后,进行快速定位其位置,然后具体的数据会被解析成二进制存储。

所以降低了Json的可读性,但提高了查找和修改的效率,存储占用上也差不太多。

查询能力突出

基本的CRUD都支持,比较特殊的是嵌套文档查询和地理空间查询。

嵌套文档查询

例如有以下数据

db.inventory.insertMany( [{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

如果要对size字段对应的文档内容,做等值查询。
下面的案例返回inventory集合中size字段的值等于文档{ h: 14, w: 21, uom: “cm” } 的所有文档。

db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

对嵌套文档整体做等值匹配的时候,要求的是对指定文档的精确匹配,包含字段顺序。

下面的案例无法查询到任何文档。

db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )

地理空间查询

地理空间数据

在MongoDB中,您可以将地理空间数据存储为GeoJSON对象遗留坐标对。

要指定GeoJSON数据,请使用嵌入的文档:

  • 一个名为type的字段,用于指定GeoJSON对象类型
  • 一个名为坐标的字段,用于指定对象的坐标。

如果指定纬度和经度坐标,请先列出经度,然后再列出纬度:

  • 有效的经度值在**-180180**之间(包括两者)。
  • 有效的纬度值在**-9090**之间(包括两者之间)。
    location: {type: "Point",coordinates: [-73.856077, 40.848447]}

还有专属的地理空间索引,这里就不过多看了,简单知道即可。
而对于查询,比如要查询:指定GeoJSON点至少1000米,最多5000米的文档,并按从最近到最远的顺序排序:

db.places.find(  {   location:  { $near:   {  $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] },   $minDistance: 1000,      $maxDistance: 5000    }   } }
)

事务支持、锁机制、MVCC

NoSQL 数据库通常不支持事务,为了可扩展和高性能进行了权衡。MongoDB 就支持事务。与关系型数据库一样,MongoDB 事务同样具有 ACID 特性。MongoDB 单文档原生支持原子性,也具备事务的特性。MongoDB 4.0 加入了对多文档事务的支持,但只支持复制集部署模式下的事务,也就是说事务的作用域限制为一个副本集内。MongoDB 4.2 引入了分布式事务,增加了对分片集群上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。

MongoDB 事务同样具有 ACID 特性,说明如下:

  • 原子性( Automicity ): 一个事务要么完全执行成功,要么不做任何改变。
  • 一致性( Consistency ): 当多个事务并行执行时,元素的属性在每个事务中保持一致。
  • 隔离性( Isolation ): 当多个事务同时执行时,互不影响。WiredTiger 本身支持多种不同类型的隔离级别,如读-未提交( read-uncommitted )(会有脏读)、读-已提交( read-committed )(会有不可重复读和幻读问题)和快照( snapshot )隔离。MongoDB 默认选择的是快照隔离。
  • 持久性( Durability ): 一旦提交事务,数据的更改就不会丢失。

WiredTiger 存储引擎支持 read-uncommitted 、read-committed 和 snapshot3 种事务隔离级别,MongoDB 启动时默认选择 snapshot 隔离。

事务开始时,系统会为将要编辑的行创建一个快照,从已提交的事务中获取行版本数据,如果行版本数据标识的事务尚未提交,则从更早的事务中获取已提交的行版本数据作为其事务开始时的值。

通过事务可以看到其他还未提交的事务修改的行版本数据,但不会看到事务 id 大于 snap_max 的事务修改的数据。

MVCC 并发控制机制

要实现事务之间的并发操作,可以使用锁机制或 MVCC 控制等。对于 WiredTiger 来说,使用 MVCC 控制来实现并发操作,相较于其他锁机制的并发,MVCC 实现的是一种乐观并发机制。

MVCC 并发控制机制:

(1) A 事务首先从表中读取要修改的行数据,读取的库存值为100,行记录的版本号为0。

(2) B 事务也从中读取要修改的相同行数据,读取的库存值为100,行记录的版本号为0。

(3) A 事务修改库存值后提交,同时行记录版本号加1,变为1,大于 A 事物一开始读取行记录版本号1,A 事务可以提交。

(4) 但 B 事务提交时发现此时行记录版本号已经变为1,产生冲突,B 事务提交失败。

(5) B 事务尝试重新提交,此时再次读取的版本号为1,加1后版本号变为2,不会产生冲突,正常提交 B 事务。

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

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

相关文章

JVM学习-监控工具(三)

jconsole 从Java5开始,在JDK中自带的java监控和管理控制台用于对JVM中内存、线程、和类等的监控,是一个基本JMX(java management extendsions)的GUI性能监控工具 三种连接方式 Local:使用JConsole连接是一个正在本地系统运行的JVM&#xf…

mfc110u.dll丢失的解决方法,分享七个有效方法

mfc110u.dll是一个动态链接库文件,属于Microsoft Foundation Classes (MFC) 的一部分。它是Microsoft Visual Studio 2012编程环境中用于C应用程序开发的一个组件。 1.2 功能与作用 mfc110u.dll文件提供了一系列的预构建类和函数,这些类和函数使得开发…

一键式AI智能知识库-谈如何打造人性化的LLM RAG知识库的重要性

RAG系统简介 在现代的LLM RAG(Retrieval-Augmented Generation)系统中,数据流的设计至关重要。让我们通过一个具体的例子来详细描述一个标准RAG系统的数据流。 首先,用户可以通过多种应用入口访问系统,包括PC应用、微…

Codestral-22B-v0.1-4bit部署

Codestral-22B-v0.1-4bit 模型文件地址 mistral-inference 仓库文件地址 一、Codestral-22B-v0.1环境安装 1、硬件配置 2、配置环境 建议最好自己新建一个conda环境 conda create -n codestral python3.10 -y cond…

Golang Silce 切片哪些事情

silce 本质上为用户提供了动态数组的功能,类型声明为 var sliceName []datatype ,datatype为类型, 1 2 3a : [1,2,3] a nil fmt.Println(a, len(a), cap(a) // [] 0 0nil slice 和普通 slice一样可以使用 cap len 内置函数,以及被 for rang…

无人机、机器人10公里WiFi远距离图传模块,实时高清视频传输,飞睿CV5200模组方案,支持mesh自组网模块

在快速发展的物联网时代,远距离无线通信技术已成为连接各种智能设备的关键。无人机、安防监控、机器人等领域对数据传输的距离和速度要求越来越高。 公里级远距离WiFi模组方案可以通过多种技术和策略的结合来实现无人机和机器人之间的高效通信传输。 飞睿智能CV52…

如何看待时间序列与机器学习?

GPT-4o 时间序列与机器学习的关联在于,时间序列数据是一种重要的结构化数据形式,而机器学习则是一种强大的工具,用于从数据中提取有用的模式和信息。在很多实际应用中,时间序列与机器学习可以结合起来,发挥重要作用。…

npm install报ENOENT: no such file or directory, open问题

没有进行npm的初始化操作导致的 npm init -y 再 npm install npm install

vue 按钮权限

想要不同的用户拥有不同的功能权限 使用v-has"search:mdtj:add&#xff08;v-has中的字符自己编辑&#xff0c;一般是目录页面具体按钮功能&#xff09; 例如&#xff1a; <a-button click"handleAdd" type"primary" icon"plus" v-ha…

Linux编程--网络层和

1.IP协议 1.1 协议头的格式 4位版本&#xff1a;指定IP协议的版本&#xff0c;IPV4就是4。 4位首部长度&#xff1a;*4 报头的长度 [0-60] 8位服务类型&#xff1a;3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量…

中电金信:从规划到落地,中电金信全程陪伴式服务助力泛金融数字化转型

在当前的全球经济和金融发展格局中&#xff0c;金融行业正经历着一场以数字化为核心的快速转型。中国银行业和保险业已经成功探索出一条数字化转型的路径&#xff0c;并积累了丰富的实践经验。然而&#xff0c;泛金融领域则仍处于数字化转型的初期阶段&#xff0c;其转型能力因…

GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践

当下是 Python 急剧发展的时代&#xff0c;越来越多的人开始学习和使用Pyhon&#xff0c;而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格&#xff0c;并解释了背后的原理和机制。 入门 Python 语言相对简单&#xff0c;但写出优雅的代码并…

开源数据库同步工具DBSyncer-数据库的连接

开源数据库同步工具DBSyncer使用的是什么数据库呢&#xff1f; 查看连接信息&#xff0c;如下&#xff1a; 如上图可知&#xff0c;DBSyncer支持两种方式的数据库连接方式&#xff0c; #storage #数据存储类型:disk(默认)/mysql(推荐生产环境使用) #disk-磁盘:/data/config(驱…

第24讲:预处理详解

文章目录 1. 预定义符号2. #define定义常量3. #define定义宏 1. 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIM…

『 Linux 』目录与软硬链接 (万字详解)

文章目录 如何理解目录目录项 目录中的权限问题根目录Dentry缓存文件的增删改查与文件系统关系软硬链接软链接硬链接 如何理解目录 目录是一个文件存在其对应独立的Inode; $ stat dirFile: ‘dir’Size: 4096 Blocks: 8 IO Block: 4096 directory Device: f…

杂谈k8s

其实看我之前的博客&#xff0c;k8s刚有点苗头的时候我就研究过&#xff0c;然后工作的时候间接接触 也自己玩过 但是用的不多就忘记了&#xff0c;正苦于不知道写什么&#xff0c;水一篇 简化容器应用程序的部署和管理 自动化部署、自动伸缩、负载均衡、存储管理、自我修复 支…

对系统管理员有用的 NMAP 命令

NMAP 是一个极其强大的网络扫描、监视和漏洞管理工具。 NMAP 命令的典型格式如下。 nmap -function --script脚本名称 <目标> 目标可以是主机 (192.168.0.1) 或网络 (192.168.0.0/24) 典型开放端口&#xff08;服务&#xff09;扫描 nmap -sV <目标> nmap -sV &…

springboot日志文件不生产问题

当指定了日志文件logback-spring.xml&#xff0c;发现项目启动的时候&#xff0c;不生产日志 解决方案&#xff1a;在yml中指定本工程具体的日志文件 logging:config: classpath:logback-spring.xml如果还是不产生日志文件的话&#xff1a;指定磁盘上具体的目录即可&#xff…

Redis几种部署模式介绍

Redis 提供了几种不同的部署模式&#xff0c;以满足不同的使用场景和可用性需求。这些模式包括单机模式、主从复制、哨兵模式和集群模式。下面我将简要介绍每种模式的特点和用途&#xff1a; 单机模式&#xff1a; 描述&#xff1a;单个 Redis 服务器实例运行在一台机器上&…

Linux中的head命令:快速查看文件头部内容

Linux中的head命令&#xff1a;快速查看文件头部内容 在Linux和Unix系统中&#xff0c;head命令是一个非常实用的工具&#xff0c;它允许用户查看文件的开头部分。无论你是在处理日志文件、配置文件还是其他大型文本文件&#xff0c;head命令都能帮助你快速定位并查看文件的前…