当前位置: 首页 > news >正文

MongoDB数据库学习

学习链接:https://www.runoob.com/mongodb/mongodb-tutorial.html

图解MongoDB数据库学习路线指南

在这里插入图片描述

MongoDB初级

1. 基本概念学习

一定要记住的概念:

在这里插入图片描述

文档是一组键值(key-value)对(即 BSON)。

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

mongodb的设计初衷就是作为一个分布式数据库,所以能够在分片环境中生成唯一的标识符非常重要。

在这里插入图片描述

2. 连接MongoDB

Compass图形化连接登录下载地址:https://www.mongodb.com/try/download/compass

在这里插入图片描述

python使用pymongo 模块连接MongoDB

在这里插入图片描述

from pymongo import MongoClientclient = MongoClient('mongodb://user:password@localhost:27017/mydatabase?authSource=admin')
db = client['mydatabase']

3. 创建数据库

在这里插入图片描述

默认数据库为test

在这里插入图片描述

注意:

  1. 在 MongoDB 中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
  2. 在MongoDB中,只有在数据库中至少有一个集合时,数据库才会在 show dbs 命令的输出中显示。

4. 事务

mongodb是一个分布式数据库,它支持跨副本集和/或分片的ACID事务。

MongoDB中级

1. 应用程序设计

模式设计

模式设计,即在文档中表示数据的方式,对于数据表示来说是非常关键的。最好的方式是按照应用程序希望看到的形式来表示数据。因此,与关系数据库不同,在为模式进行建模之前,首先需要了解查询和数据访问的方式。
以下是在设计模式时需要考虑的几个关键方面。

  1. 限制条件
    有一些数据库或硬件的限制是你需要了解的。你还需要考虑mongodb的一些特殊之处,比如最大文档大小为16MB、从磁盘读写完整文档、更新会重写整个文档,以及在文档级别进行原子更新。
  2. 查询和写入的访问模式
    你需要确定并量化应用程序和更大系统的工作负载。工作负载包括应用程序中的读操作和写操作。一旦知道了查询的运行时间和频率,就可以识别最常见的查询。这些查询是在进行模式设计时需要支持的。一旦确定了这些查询,就应该尽量减少查询的数量,并在设计中确保一起查询的数据存储在同一个文档中。
    这些查询中未使用的数据应该存放在不同的集合中。不经常使用的数据也应该移动到不同的集合中。需要考虑是否可以将动态(读/写)数据和静态(主要是读)数据分离开。在进行模式设计时,提高最常见查询的优先级会获得最佳的性能。
  3. 关系类型
    应该根据应用程序的需要以及文档之间的关系来考虑哪些数据是相关的。然后你就可以确定对于数据或文档,是应该嵌入还是引用。需要弄清楚如何在不执行其他查询的情况下引用文档,以及当关系发生变化时需要更新多少文档。还必须考虑数据结构是否易于查询,比如使用内嵌数组(数组中的数组)对某些关系进行建模。
  4. 基数
    当确定文档和数据的关联方式后,应考虑这些关系的基数,比如具体是一对一、一对多、多对多、一对百万,还是多对几十亿?确定关系的基数非常重要,可以确保在mongodb的模式中使用最佳格式进行建模。还应该考虑是会对多/百万这一端的对象进行访问还是只访问上层对象的内容,以及相关数据字段的更新与读取的比例。充分考虑这些问题将有助于确定应采用内嵌文档还是引用文档,以及是否应该跨文档对数据进行反范式化处理。

设计模式

模式设计在mongodb中很重要,它能直接影响应用程序的性能。在模式设计中可以使用已知的模式或者采用“搭积木”的方式来解决许多常见的问题。最好一起使用一个或多个模式。
可以使用的设计模式包括以下几种。

  1. 分桶模式
    这种模式适用于时间序列数据,其中数据在一段时间内被捕获为数据流。在mongodb中,将这些数据“分桶”存储到一组文档中,每个文档会保存特定时间范围内的数据,这比在每个时间点/数据点创建一个文档更高效。例如,可以使用一小时的存储桶,并将该时间内的所有数据都放到文档的一个数组中。文档本身有开始和结束时间,以表明这个“桶”涵盖的时间段。
  2. 树形模式
    当你有很多查询并且数据主要是层次结构时,可以使用这种模式。它遵循前面提到过的,将经常一起查询的数据存储在一起的概念。在mongodb中,可以很容易地将层次结构存储在同一个文档的数组中。

2. 副本集

mongodb的设计采用了横向扩展。面向文档的数据模型使跨多台服务器拆分数据更加容易。mongodb会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上。

创建副本集

复制是将数据的相同副本保留在多台服务器的一种方法,建议将其用于所有生产部署中。即使一台或多台服务器停止运行,使用复制功能也可以确保应用程序正常运行和数据安全。
在mongodb中,创建副本集就可以使用复制功能了。副本集是一组服务器,其中一个是用于处理写操作的主节点,还有多个用于保存主节点的数据副本的从节点。如果主节点崩溃了,则从节点会从其中选取出一个新的主节点。
如果使用复制功能时有一台服务器停止运行了,那么仍然可以从副本集中的其他服务器访问数据。如果服务器上的数据已损坏或无法访问,则可以从副本集中的其他成员中创建一份新的数据副本。
如果你对复制机制不那么感兴趣,而只是想创建一个用于测试/开发或生产的副本集,请使用mongodb的云端解决方案mongodb Atlas,它易于使用,并提供了免费的付费选项以供使用。另外,如果想在自己的基础架构中管理mongodb集群,也可以使用Ops Manager。

在生产环境中,应该始终使用副本集并为每个成员分配一个专用主机,以避免资源争用,并针对服务器故障提供隔离。为了提供更多的弹性,还应该使用DNS种子列表连接格式指定应用程序如何连接到副本集。使用DNS的优点在于可以轮流更改托管mongodb副本集成员的服务器,而无须重新配置客户端(尤其是它们的连接字符串)。
副本集中的每个成员都必须能够连接到其他成员(包括自身)。如果收到有关成员无法访问到其他正在运行成员的错误,则可能需要更改网络配置以允许它们之间的连接。
配置副本集时,在绑定到非localhost的IP地址之前,应该启用授权控制并指定身份验证机制。另外,最好对磁盘上的数据和副本集成员之间以及副本集与客户端之间的通信进行加密。

复制是指在多台服务器上保持相同的数据副本。mongodb实现此功能的方式是保存操作日志(oplog),其中包含了主节点执行的每一次写操作。oplog是存在于主机点local数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。
每个从节点都维护着自己的oplog,用来记录它从主节点复制的每个操作。这使得每个成员都可以被用作其他成员的同步源。

每个成员需要知道其他成员的状态:谁是主节点?谁可以作为同步源?谁停止运行了?为了维护副本集的最新视图,所有成员每隔两秒会向副本集的其他成员发送一个心跳请求。心跳请求用于检查每个成员的状态。
心跳的一个最重要的功能是让主节点知道自己是否满足副本集“大多数”的条件。如果主节点不再得到“大多数”节点的支持,它就会降级,成为一个从节点。

3. 分片

分片是指跨数据拆分数据的过程,有时也会用术语分区来表示这个概念。通过在每台机器上放置数据的子集,无须功能强大的机器,只使用大量功能稍弱的机器,就可以存储更多的数据并处理更多的负载。分片还可以用于其他目的,包括将经常访问的数据放置在更高性能的硬件上,或基于地理位置来拆分集合中的文档以使它们接近最常对其访问的应用程序服务器。
mongodb支持自动分片,这种方式试图将数据库架构从应用程序中抽离出来,并简化系统管理。在某种程度上,mongodb允许应用程序好像始终在和一台单机的mongodb服务器对话一样。在运维方面,mongodb可以自动均衡分片上的数据,使容量的添加和删除变得更容易。

无论从开发还是运维的角度来看,分片都是最复杂的mongodb配置方式。有许多组件需要配置和监控,数据在集群中会自动转移。在尝试部署或使用分片集群之前,应该首先熟悉单机服务器和副本集。此外,与副本集一样,配置和部署分片集群的推荐方式是通过mongodb Ops Manager或mongodb Atlas。如果需要保留对计算基础设施的控制,建议使用Ops Manager。如果可以将基础设施管理留给mongodb,则推荐使用mongodb Atlas。

理解集群组件

MongoDB的分片机制允许你创建一个由许多机器(分片)组成的集群,并将集合中的数据分散在集群中,在每个分片上放置数据的一个子集。这允许应用程序超出单机服务器或副本集的资源限制。

复制和分片的区别:复制在多台服务器上创建了数据的精确副本,因此每台服务器都是其他服务器的镜像。相反,每个分片包含了不同的数据子集。

分片的目标之一是使由两个、3个、10个甚至数百个分片组成的集群对应用程序来说就像是一台单机服务器。对了对应用程序隐藏这些细节,需要在分片前面运行一个或多个称为mongos的路由进程。mongos维护着一个“目录”,指明了哪个分片包含哪些数据。

记住,分片的主要使用场景是拆分数据集以解决硬件和成本的限制,或为应用程序提供更好地性能(比如地理分区)。MongoDB分片以一种与应用程序在许多方面无缝对接的方式提供了这些功能。

何时分片

通常情况下,分片用于:

  1. 增加可用RAM;
  2. 增加可用磁盘空间;
  3. 减少服务器的负载;
  4. 处理单个mongod无法承受的吞吐量;
    因此,良好的监控对于决定何时需要分片非常重要。

相关文章:

  • Linux——初步认识Shell、深刻理解Linux权限
  • k8s的出现解决了java并发编程胡问题了
  • 【Ragflow】25.Ragflow-plus开发日志:excel文件解析新思路/公式解析适配
  • 【Spring AI】调用 DeepSeek 实现问答聊天
  • 【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3
  • 谷歌地图苹果版v6.138.2 - 前端工具导航
  • Redis:常用数据结构 单线程模型
  • pikachu靶场通关笔记11 XSS关卡07-XSS之关键字过滤绕过(三种方法渗透)
  • pikachu靶场通关笔记12 XSS关卡08-XSS之htmlspecialchars(四种方法渗透)
  • 一个html实现数据库自定义查询
  • 持续领跑中国异地组网路由器市场,贝锐蒲公英再次登顶销量榜首
  • UI自动化常见的一些问题解决方式
  • 「EN 18031」访问控制机制(ACM - 1):智能路由器的安全守卫
  • JavaScript基础-数组/对象
  • 【数据分析】第四章 pandas简介(2)
  • 3.1 HarmonyOS NEXT分布式数据管理实战:跨设备同步、端云协同与安全保护
  • Elasticsearch + Milvus 构建高效知识库问答系统《一》
  • C++仿RabbitMQ实现消息队列
  • 华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
  • QT实现动画翻转效果
  • 免费创办网站/百度百科官网登录
  • wordpress 5.2.2中文版/页面优化
  • 北京建设工程网站/电商运营多少钱一个月
  • 正在为您跳转中/北京搜索优化排名公司
  • 网站的轮播图一般是做多大/免费推广引流平台推荐
  • 鲅鱼圈网站建设/原创代写文章平台