MongoDB原理

目录

一、概念

二、架构

2.1 逻辑结构

2.2 数据模型

2.3 存储引擎:WiredTiger 

三、事务


一、概念

 MongoDB是文档数据库,基本存储单元是 文档(Document),以BSON格式(一种类json的二进制形式)存储,文档可以包含键值对、嵌套文档、数组等复杂结构,字段可以动态扩展,需要在代码层管理数据约束,适合存储非结构化数据或半结构化数据(如日志、IoT 传感器数据、实时分析)。

文档结构示例:

{"_id": ObjectId("507f191e810c19729de860ea"), // MongoDB 自动生成的唯一主键"name": "Alice Smith","age": 30,"email": "alice@example.com","address": {"street": "123 Main St","city": "Anytown","zip": "12345"},"hobbies": ["reading", "hiking", "photography"],"created_at": ISODate("2023-10-27T10:00:00Z")
}

设计目标:是解决关系型数据库在处理海量数据、高并发、灵活数据结构时遇到的扩展性、性能瓶颈和模式僵化问题。

MongoDB与关系型数据库RDBMS对比:

文档 (Document): 数据存储和操作的基本单元,类似于 JSON 对象,结构是键值对。

集合 (Collection):一组相关文档的容器,同一个集合(Collection)中的文档不要求具有相同的结构(模式自由/动态模式)。字段可以动态添加、修改或删除。

数据库 (Database):包含多个集合的物理容器,用于逻辑上隔离不同的应用或数据集,每个数据库有自己的用户、权限、集合和索引。

 MongoDB中Document中可以出现的数据类型:

二、架构

2.1 逻辑结构

MongoDB与MySQL架构相差不多,底层都使⽤了可插拔的存储引擎以满用户的不同需要。最新版本的 MongoDB 中使用了 WiredTiger 作为默认的存储引擎,WiredTiger 提供了不同粒度的并发控制和压缩机制,能够为不同种类的应用提供了最好的性能和存储率。

在存储引擎上层的就是 MongoDB 的数据模型和查询语言了,由于 MongoDB 对数据的存储与 RDBMS 有较大的差异,所以它创建了一套不同的数据模型和查询语言。

2.2 数据模型

MongoDB的数据模型有两种

1> 内嵌:把相关联的数据保存在同一个文档结构中

  • 适用场景:一对一或一对少关系,高频查询的子数据。

  • 示例:用户档案中直接嵌套地址信息

{"user_id": 1001,"profile": {"birthdate": "1990-05-15","education": "硕士"}
}
  • 优点:单次查询获取全部数据,读写高效。

  • 缺点:文档大小可能膨胀(上限 16MB)。

2> 引用:通过存储数据引用信息来实现两个不同文档之间的关联

  • 适用场景:一对多或多对多关系,子数据独立更新频繁。

  • 示例:用户与订单通过 _id 关联

// users 集合
{ "_id": ObjectId("662a1b87c1b6e32a50f1a9e2"), "name": "张三","email": "zhangsan@example.com"
}// orders 集合
{ "_id": ObjectId("55f14312c7447c3da7051b27"),"user_id": ObjectId("662a1b87c1b6e32a50f1a9e2"),  // 引用用户ID"items": ["手机", "耳机"],"total": 5999
}
// 关联查询:获取所有订单及其对应的用户信息
db.orders.aggregate([{$lookup: {from: "users",          // 关联的集合名localField: "user_id",  // 当前集合的关联字段foreignField: "_id",    // 目标集合的关联字段as: "user_info"         // 输出字段名(数组)}}
])// 输出结果
{"_id": ObjectId("55f14312c7447c3da7051b27"),"user_id": ObjectId("662a1b87c1b6e32a50f1a9e2"),"items": ["手机", "耳机"],"total": 5999,"user_info": [  // 注意:结果总是数组{"_id": ObjectId("662a1b87c1b6e32a50f1a9e2"),"name": "张三","email": "zhangsan@example.com"}]
}
  • 优点:数据冗余少,易于维护一致性。

  • 缺点:需多次查询($lookup 聚合操作可缓解)。

2.3 存储引擎:WiredTiger 

存储引擎负责管理如何在磁盘上存储数据、处理读写操作、实现事务、管理内存缓存等。

MongoDB支持的存储引擎有MMAPv1,WiredTiger和InMemory。InMemory存储引擎用于将数据只存储在内存中,只将少量的元数据(meta-data)和诊断日志(Diagnostic)存储到硬盘文件中,由于不需要Disk的IO操作,就能获取所需的数据,InMemory存储引擎大幅度降低了数据查询的延迟(Latency)。从mongodb3.2开始默认的存储引擎是WiredTiger,3.2版本之前的默认存储引擎是MMAPv1,mongodb4.x版本不再支持MMAPv1存储引擎。

核心原理:

  • 文档级并发控制: 这是 WiredTiger 高性能的关键。它允许对集合中的不同文档进行并发读写操作(写操作在文档级别加锁),极大地提高了多核CPU环境下的吞吐量。相比之前的 MMAPv1 引擎(集合级锁),这是质的飞跃。

  • 写操作流程

    • 数据写入 Journal 预写日志(防崩溃)

    • 更新内存中的 Cache

    • 后台线程异步刷盘:

      • 每 60 秒生成 Checkpoint

      • 压缩后写入数据文件

  • 写优化与持久性:

    • Write Ahead Logging (WAL): 所有写操作首先被顺序、快速地写入一个持久化的 Journal 文件(并默认写入Cache)。这确保了即使发生崩溃,也能根据 Journal 恢复未刷盘的数据,保证操作的持久性(Durability)。

    • 内存管理: 使用缓存(Cache) 来存储频繁访问的数据和索引(通过 LRU 算法管理)。写操作先在内存的 Cache 中进行修改,然后异步写入 Journal 和最终刷入数据文件。读操作优先从 Cache 读取。

    • Checkpoints: WiredTiger 定期(默认 60 秒或 Journal 达到 2GB)将内存中修改过的数据(脏页)以一致的状态快照写入数据文件。Checkpoint 是数据的持久化点,缩短了崩溃恢复时需要从 Journal 重放的操作量。

  • 压缩: WiredTiger 支持对数据(Snappy 或 Zlib)和索引(Prefix)进行压缩,显著节省磁盘空间并减少 I/O。

  • B-Tree 索引存储: WiredTiger 使用 B-Tree 数据结构存储索引(这是 MongoDB 索引的主要实现方式)。

  • WiredTiger 关键配置 (mongod.conf)

storage:engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 10                  # 内存缓存大小 (建议为物理内存50%)journalCompressor: snappy         # 日志压缩算法collectionConfig:blockCompressor: zstd             # 数据压缩算法 (zstd平衡性能/压缩比)indexConfig:prefixCompression: true           # 索引前缀压缩

三、事务

  • 支持范围: MongoDB 4.0+ 支持多文档事务(ACID),适用于副本集;MongoDB 4.2+ 支持分布式事务(跨分片事务)。

  • 实现原理:

    • 使用快照隔离 (Snapshot Isolation) 级别。事务看到的是事务开始时数据库的一致性快照。

    • 在 WiredTiger 存储引擎中,事务通过 MVCC (多版本并发控制) 实现。写操作在事务提交前对其他事务不可见。

    • 涉及跨分片事务时,由协调者(通常是发起事务的 Mongos 或 Mongod)使用 Two-Phase Commit (2PC) 协议协调所有参与分片。

  • 注意事项: 虽然提供了 ACID 保证,但分布式事务比单文档操作开销大得多,应谨慎使用,避免长时间运行的事务。单文档操作天生具有原子性。

举例

const session = db.getMongo().startSession();  // 1. 创建会话
session.startTransaction({                     // 2. 启动事务readConcern: { level: "snapshot" },writeConcern: { w: "majority" }
});
try {const coll = session.getDatabase("test").users;coll.updateOne({ name: "Alice" }, { $inc: { balance: -100 } }); // 3. 操作1coll.updateOne({ name: "Bob" }, { $inc: { balance: 100 } });    // 4. 操作2session.commitTransaction();               // 5. 提交事务
} catch (error) {session.abortTransaction();                // 6. 出错回滚
}

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

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

相关文章

《解码音频:从基础到未来的听觉探索》

音频:开启声音世界的大门 在生活的每一个角落,音频如影随形,编织出丰富多彩的听觉体验。清晨,第一缕阳光尚未完全照进房间,手机里温柔的闹钟铃声,将我们从睡梦中轻轻唤醒,开启活力满满的一天。通…

web安全之h2注入系统学习

起初是在N1 Junior 2025 上面碰到一题,考点是h2的sql注入。由于之前没有见过,趁此机会系统学习一番 实验代码 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…

AWS认证系列:考点解析 - cloud trail,cloud watch,aws config

🎯一句话总览: 服务名类比/角色主要功能CloudTrail监控摄像头录像回放记录“谁在什么时候做了什么操作”CloudWatch护士测体温 护士喊医生实时监控系统状态,并能报警/自动应对AWS Config保安巡逻 记录资产变更历史记录 AWS 资源的“配置状…

Java八股文——数据结构「数据结构篇」

了解哪些数据结构? 面试官您好,我了解并使用过多种数据结构。在我的理解中,数据结构可以分为几个大的类别,每一类都有其独特的优势和适用场景。 1. 线性结构 (Linear Structures) 这类结构的特点是数据元素之间存在一对一的线性…

C#测试调用EPPlus根据批注设置excel单元格内容

EPPlus也是常用的Excel文件操作库,但不同于ClosedXML,使用EPPlus前需要设置授权信息,商业应用需要设置商业授权,个人使用或非商业应用也需要设置授权(测试的时候只需设置全名,保存excel文件时会保存到文件详…

windows本地搭建skywalking, 线程池中traceId不丢失

1.从官网下载9.0.0版本 Downloads | Apache SkyWalking 其它历史版本的 下载地址 Index of /dist/skywalking 这个页面 可以下载 apm服务: apache-skywalking-apm-9.0.0.tar.gz agent的包: apache-skywalking-java-agent-9.0.0.tgz 2.解压后, (看情况去config路径下 appli…

多模态大语言模型arxiv论文略读(135)

Agent S: An Open Agentic Framework that Uses Computers Like a Human ➡️ 论文标题:Agent S: An Open Agentic Framework that Uses Computers Like a Human ➡️ 论文作者:Saaket Agashe, Jiuzhou Han, Shuyu Gan, Jiachen Yang, Ang Li, Xin Eric…

wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段

wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段 你提到的情况: 使用 wpa_supplicant 成功连接到路由器; 然后通过 udhcpc(DHCP客户端&#xff09…

[Hestia]开源网络服务器控制面板,快速、可靠、开源

测评介绍 本期测评试用一下Hestia这款面板。Hestia是一个由国际社区支持开发的开源项目,2019年正式发布,目前已积累1.1万余次代码提交,几乎每周都有十多次的代码提交,更新热度很高。仅支持比较新的debian和ubuntu,对于…

Windows 安装 Redis8.0.2

1.下载 Releases redis-windows/redis-windowshttps://github.com/redis-windows/redis-windows/releases 下载后直接解压到想要的安装目录就行了,启动Redis直接双击 redis-server.exe 文件就行了,Redis启动后双击 redis-cli.exe 就可以直接连接到Redi…

GitHub中openmmlab和Detectron2的区别

MMDetection 和 Detectron2 都是计算机视觉领域中流行的开源目标检测框架,它们有许多相似之处,但也存在一些关键差异。以下是两者的主要区别: 1. 开发团队与社区 MMDetection 由中国开源组织 OpenMMLab 开发维护,社区以中文用户为…

开疆智能CCLinkIE转ModbusTCP网关连接施耐德TCP从站配置案例

本案例是三菱PLC通过CCLinkIE转ModbusTCP网关连接施耐德Modicon M262 Logic/Motion Controller的配置案例 配置方法: 首先设置Modicon M262 Logic/Motion Controller Modbus TCP 从站设备 I/O 映射选项卡 I/O 以如下方式从主站视角映射到 Modbus 寄存器&#xff1…

【源码】Reactive 源码

前言 用了很长时间的 componsition-api 了,最近想看看源码,抱着单纯的学习心态先从 reactive 开始吧。 个人习惯: 看代码要带着问题去看,不要盲目的去看问题就是这次看源码的主线,要围绕着主线去展开,过…

银河麒麟 | ubuntu 安装国产达梦DM8数据库(安装+外网通+IDEA连接)

目录 官网下载安装 下载安装包 创建安装用户组dinstall 创建安装用户dmdba并指定组 创建DM8软件安装目录修改权限 检查、修改系统资源限制 解压.zip的压缩包 安装mount数据库 图形化安装 清除之前的挂载 开启Disql服务 修改dmdba的环境变量 检查状态 进入数据库 …

MySQL与Oracle视图:深入解析与全面对比

视图概念 视图在 MySQL 与Oracle中本质上是一种虚拟表,其数据并非实际存储,而是基于一个或多个基础表的查询结果动态生成。它像是对复杂查询的一种封装,极大地简化了数据的查询操作。例如,当我们需要频繁从多个关联表中获取特定数…

uniapp通过webview套h5时使用plus调取蓝牙/usb打印

安卓使用usb调取打印机 /*** 安卓usb调取打印机*param { string | bytes[] } html 传入的打印内容*传入一段文本或一个bytes数组* returns*/ export const printUsb (html) > {return new Promise((resolve, reject) > {if (!window.plus) return reject(new Error(&qu…

吃透 Golang 基础:基于共享变量的并发

文章目录 sync.Mutex 互斥锁sync.RWMutex 读写锁sync.Once 惰性初始化Goroutine 与线程动态栈Goroutine 调度GOMAXPROCSGoroutine 没有 ID 号 上一篇文章当中我们已经系统性地回顾了在 Go 当中基于 Goroutine 和 Channel 进行并发控制的方法,Goroutine 指的是 Golan…

智绅科技丨如何选择一家好的养老机构?

居家养老、社区养老和机构养老是我们在养老相关消息中常常听到的3个词。在地方文件中,居家养老和社区养老还经常被统称为居家社区养老或 社区居家养老。那么,这三者之间到底有什么不同呢? 居家养老服务涵盖生活照料、家政服务、康复护理、医…

【支持向量机】SVM线性支持向量机学习算法——软间隔最大化支持向量机

支特向量机(support vector machines, SVM)是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器。包含线性可分支持向量机、 线性支持向量机、非线性支持向量机。 当训练数据近似线性可分时,通过软间隔最大化学习线性分类器, 即为…

面试 — 预准备 — 面试前准备攻略

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受. 只讲干货,不罗里吧嗦! 作为一个软件从业者,在面试前的准备工作至关重要,能大幅提升你的求职成功…