MongoDB数据库学习

article/2025/6/8 5:44:36

学习链接: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无法承受的吞吐量;
    因此,良好的监控对于决定何时需要分片非常重要。

http://www.hkcw.cn/article/bwYuXLDSxo.shtml

相关文章

软考 系统架构设计师系列知识点之杂项集萃(79)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(78) 第141题 软件测试一般分为两个大类:动态测试和静态测试。前者通过运行程序发现错误,包括()等方法;后者采用人工和计算机…

分布式拜占庭容错算法——PBFT算法深度解析

Java 实现PBFT算法深度解析 一、PBFT核心流程 #mermaid-svg-3DQWQzd1C7QGWkMv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3DQWQzd1C7QGWkMv .error-icon{fill:#552222;}#mermaid-svg-3DQWQzd1C7QGWkMv .error-…

【LUT技术专题】图像自适应3DLUT代码讲解

本文是对图像自适应3DLUT技术的代码解读,原文解读请看图像自适应3DLUT文章讲解 1、原文概要 结合3D LUT和CNN,使用成对和非成对的数据集进行训练,训练后能够完成自动的图像增强,同时还可以做到极低的资源消耗。下图为整个模型的…

Docker 在 AI 开发中的实践:GPU 支持与深度学习环境的容器化

人工智能(AI)和机器学习(ML),特别是深度学习,正以前所未有的速度发展。然而,AI 模型的开发和部署并非易事。开发者常常面临复杂的依赖管理(如 Python 版本、TensorFlow/PyTorch 版本、CUDA、cuDNN)、异构硬件(CPU 和 GPU)支持以及环境复现困难等痛点。这些挑战严重阻…

COMSOL多边形骨料堆积混凝土水化热传热模拟

混凝土水化热温降研究对保障结构安全与耐久性至关重要,温升后温差易引发温度应力,导致裂缝。本案例介绍在COMSOL内建立多边形骨料堆积混凝土细观模型,并对水化热产生后的传热及温度变化进行仿真模拟。 骨料堆积混凝土细观模型采用CAD多边形…

vue入门环境搭建及demo运行

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 vue简介:第一步:安装node.jsnode简介第二步:安装vue.js第三步:安装vue-cli工具第四步 :安装webpack第五步…

OpenCV CUDA模块图像处理------图像融合函数blendLinear()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数执行 线性融合(加权平均) 两个图像 img1 和 img2,使用对应的权重图 weights1 和 weights2。 融合公式…

“packageManager“: “pnpm@9.6.0“ 配置如何正确启动项目?

今天在学习开源项目的时候,在安装依赖时遇到了一个报错 yarn add pnpm9.6.0 error This projects package.json defines "packageManager": "yarnpnpm9.6.0". However the current global version of Yarn is 1.22.22.Presence of the "…

物联网数据归档之数据存储方案选择分析

在上一篇文章中《物联网数据归档方案选择分析》中凯哥分析了归档设计的两种方案,并对两种方案进行了对比。这篇文章咱们就来分析分析,归档后数据应该存储在哪里?及存储方案对比。 这里就选择常用的mysql及taos数据库来存储归档后的数据吧。 你在处理设备归档表存储方案时对…

八.MySQL复合查询

一.基本查询回顾 分组统计 group by 函数作用示例语句说明count(*)统计记录条数select deptno, count(*) from emp group by deptno;每个部门有多少人?sum(sal)某字段求和select deptno, sum(sal) from emp group by deptno;每个部门总工资avg(sal)求平均值select…

智能补丁管理:终结安全漏洞,开启自动化运维新时代

漏洞风暴:数字化时代的隐形战场 全球安全态势的范式转移 近年来,终端层漏洞已成为企业安全防线的最大突破口。根据美国国家标准与技术研究院(NIST)的监测数据,2023年新披露的高危漏洞数量同比增长62%,其中…

大模型 提示模板 设计

大模型 提示模板 设计 论文介绍:LangGPT - 从编程语言视角重构大语言模型结构化可复用提示设计框架 核心问题: 现有提示工程缺乏结构化设计模板,依赖经验优化,学习成本高且复用性低,难以支持提示的迭代更新。 创新思路: 受编程语言的结构化和可复用性启发,提出LangGP…

不连网也能跑大模型?

一、这是个什么 App? 你有没有想过,不用连网,你的手机也能像 ChatGPT 那样生成文字、识别图片、甚至回答复杂问题?Google 最近悄悄发布了一个实验性 Android 应用——AI Edge Gallery,就是为此而生的。 这个应用不在…

基于开源AI大模型与AI智能名片的S2B2C商城小程序源码优化:企业成本管理与获客留存的新范式

摘要:本文以企业成本管理的两大核心——外部成本与内部成本为切入点,结合开源AI大模型、AI智能名片及S2B2C商城小程序源码技术,构建了企业数字化转型的“技术-成本-运营”三维模型。研究结果表明,通过AI智能名片实现获客留存效率提…

【AFW+GRU(CNN+RNN)】Deepfakes Detection with Automatic Face Weighting

文章目录 Deepfakes Detection with Automatic Face Weighting背景pointsDeepfake检测挑战数据集方法人脸检测面部特征提取自动人脸加权门控循环单元训练流程提升网络测试时间增强实验结果Deepfakes Detection with Automatic Face Weighting 会议/期刊:CVPRW 2020 作者: …

【Zephyr 系列 6】使用 Zephyr + BLE 打造蓝牙广播与连接系统(STEVAL-IDB011V1 实战)

🧠关键词:Zephyr、BLE、广播、连接、GATT、低功耗蓝牙、STEVAL-IDB011V1 📌适合人群:希望基于 Zephyr 实现 BLE 通信的嵌入式工程师、蓝牙产品开发人员 🧭 前言:为什么选择 Zephyr 开发 BLE? 在传统 BLE 开发中,我们大多依赖于厂商 SDK(如 Nordic SDK、BlueNRG SD…

【前端后端环境】

学习视频【带小白做毕设02】从0开始手把手带你做Vue框架的快速搭建以及项目工程的讲解 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (buil…

机器学习:决策树和剪枝

本文目录: 一、决策树基本知识(一)概念(二)决策树建立过程 二、决策树生成(一)ID3决策树:基于信息增益构建的决策树。(二)C4.5决策树(三&#xff…

【Vmware】虚拟机安装、镜像安装、Nat网络模式、本地VM8、ssh链接保姆篇(图文教程)

文章目录 Vmware下载Vmware安装镜像安装虚拟机安装网络模式Nat模式设置ssh链接 更多相关内容可查看 Vmware下载 官网下载地址:https://vmoc.waltzsy.com/?bd_vid8868926919570357435#goods Vmware安装 以管理员身份运行 弹框如下,点击下一步 我同意&…