mongodb内部培训
目录
mongodbV4.4文档:
https://www.mongodb.com/docs/v4.4/
对于一些基础的安装、crud操作和查询,可以通过官方的文档和教程进行学习,本文内容只涉及开发人员知识。不涉及运维、部署等内容。
简介
MongoDB是一种开源的文档型数据库管理系统,它使用文档来存储数据,文档是一种类似于JSON的数据结构,可以包含键值对、数组和嵌套文档。这种灵活的数据模型使得MongoDB适用于各种类型的数据。
基础概念
- 数据库(Database):数据库是MongoDB中的顶层容器,用于存储相关数据的集合。每个数据库都有自己的权限和安全性设置,并且可以在同一台服务器上同时存在多个数据库。在MongoDB中,可以使用命令
use <database_name>
来切换到指定的数据库。 - 集合(Collection):集合是数据库中的一个逻辑分组,类似于关系型数据库中的表。它是一组相关文档的容器,每个文档都可以有不同的结构。集合中的文档可以根据需要动态地添加或删除字段,没有固定的模式要求。在MongoDB中,可以使用命令
db.<collection_name>
来访问指定的集合。 - 文档(Document):文档是MongoDB中的基本数据单元,类似于关系型数据库中的行。它是一个键值对的集合,可以包含各种类型的数据,如字符串、数字、日期、数组、嵌套文档等。文档使用类似于JSON的格式表示,具有灵活的结构。在MongoDB中,文档以BSON(Binary JSON)格式存储,这种格式可以有效地表示复杂的数据结构
适用场景
-
非结构化的数据结构
我觉得这是相比于mysql等关系型数据库最主要的区别,也是选用mongodb的主要原因~
MongoDB的文档型数据模型非常灵活,可以根据需要动态地添加或删除字段,没有固定的模式要求。这使得MongoDB适用于需要频繁变化的数据结构或者需要存储半结构化数据的场景。
-
大数据量和高性能要求
在mongodb中常用的数据都缓存在内存里,这样大部分操作只需要读内存,自然很快。此外,文档模式设计一般会是的你所需要的数据都相对集中在一起(这也应该是我们选则monogodb存储数据的最佳范式,即内联文档),减少了关系性数据库需要从各个地方去把数据找过来(然后Join)所耗费的随机读时间。
-
复杂的查询需求
MongoDB提供了强大的查询语言和丰富的查询功能,包括查询操作符、聚合管道和地理空间查询等。这使得在MongoDB中执行复杂的查询变得更加简单和高效。
-
天生适用于云原生和微服务架构
...
数据建模
mongodb中数据模型设计的最佳实践
mongodb中支持两种数据模型:
嵌入式数据模型
MongoDB可以将相关数据嵌入到单个结构或文档中。这些模式通常被称为“非规范化”模型,如下图:
嵌入式模型应该是我们使用mongodb优先考虑的数据结构,通过使用这种结构,我们可以使用更少的查询和更新语句来完成操作。
同时我们也能减少使用事务操作。
标准化数据模型
和关系型数据库一致,如图:
在mongodb中,通常在以下几种情况下,才考虑这种数据结构:
-
嵌入的数据量过多,且包含了很多热门业务不需要的数据,这反而回降低读取操作的速度。
好比我们的model_origin表。质量、进度、造价都有各自的业务属性。各自主流业务也只关心自己的数据,所以拆开反增加访问速度,和降低技术负债。
-
更复杂的多对多关系
多对多的关系中,使用传统的关系型数据架构能够有更清晰的业务逻辑,数据的一致性保持也更简单,所以多对多不建议使用嵌入式方式。
N对N关系
- 一对一: 看业务,大多数情况使用嵌入式
- 一对多: 看业务,大多数使用折中方案, 部分嵌入,部分走引用。
- 多对多: 关系型
事务
在monogodb中,写操作在单个文档级别上是天生原子的,即使该操作修改了单个文档中的多个嵌入文档(这也是为什么建议优先使用嵌入的原因)。
当单个写入操作修改多个文档,每个文档的修改都是原子的,但操作作为一个整体不是原子的。此时需要引入分布式事务处理。
MongoDB支持多文档事务:
- 在版本4.0中,MongoDB支持副本集上的多文档事务。
- 在4.2版本中,MongoDB引入了分布式事务,增加了对分片集群上多文档事务的支持,并结合了对副本集上多文档事务的现有支持。此后mongodb中 【分布式事务】和【多文档事务】是一个意思。
- ...
在大多数情况下,多文档事务比单文档写入带来更大的性能成本,并且多文档事务的可用性不应取代有效的模式设计。对于许多场景,反规范化的数据模型(嵌入文档和数组)将继续是最适合您的数据和用例的。也就是说,对于许多场景,适当地对数据建模将最大限度地减少对多文档事务的需求。
生产经验
下面列一些实际使用中遇到的关于事务失败的才坑点,详细内容,参看官方文档
-
运行时间的限制
默认情况下,事务的运行时间必须小于一分钟。您可以对
mongod
实例使用transactionLifetimeLimitSeconds
修改此限制。对于分片集群,必须为所有分片副本集成员修改该参数。超过此限制的事务将被视为已过期,并将由定期清理进程中止。//设置事务超时为30s db.adminCommand( { setParameter: 1, transactionLifetimeLimitSeconds: 30 } ) //也可以添加启动参数 mongod --setParameter "transactionLifetimeLimitSeconds=30"
-
Oplog 操作日志的大小限制
标签:MongoDB,查询,索引,文档,mongodb,集合 From: https://www.cnblogs.com/cnff/p/17545501.html