MongoDB 介绍
一、MongoDB 介绍
MongoDB 是一个开源的、面向文档的数据库管理系统。它采用了灵活的数据模型,以类似 JSON 的文档形式存储数据,具有高可扩展性、高性能和丰富的功能。
主要特点包括:
- 灵活的数据模型:文档型数据库允许存储不同结构的文档,无需预先定义固定的模式。可以随时添加新的字段或修改现有字段,非常适合快速变化的应用场景。
- 高可扩展性:支持水平扩展,可以通过分片机制将数据分布在多个服务器上,以处理大规模数据和高并发访问。
- 丰富的查询语言:提供类似 SQL 的查询语言,支持复杂的查询操作,包括条件查询、排序、聚合等。同时,还支持索引以提高查询性能。
- 高可用性:支持副本集,可以实现数据冗余和故障转移,确保在节点故障时数据的持续可用。
- 支持多种编程语言:提供了丰富的驱动程序,支持多种编程语言,方便开发人员进行应用开发。
二、MongoDB 原理
-
存储结构:
- MongoDB 将数据存储在文档中,文档是一种类似于 JSON 的结构,由键值对组成。文档可以包含不同类型的数据,如字符串、数字、日期、数组、嵌套文档等。
- 数据库由多个集合组成,集合类似于关系型数据库中的表,但没有固定的模式。集合中的文档可以具有不同的结构。
- MongoDB 使用内存映射文件进行数据存储,将数据文件映射到内存中,提高数据的读写性能。
-
索引机制:
- MongoDB 支持多种类型的索引,包括单键索引、复合索引、文本索引、地理空间索引等。索引可以提高查询性能,特别是对于经常进行的查询操作。
- MongoDB 会自动为文档的唯一标识符(_id)创建索引,也可以根据应用需求手动创建其他索引。
-
复制集:
- 复制集是一组 MongoDB 服务器,其中一个服务器被指定为主服务器,其他服务器为从服务器。主服务器负责处理所有的写操作,并将数据同步到从服务器。
- 从服务器可以提供读操作的负载均衡,提高系统的可用性和性能。如果主服务器发生故障,复制集会自动选举一个新的主服务器。
-
分片:
- 分片是将数据分布在多个 MongoDB 服务器上的机制,以实现水平扩展。数据被分成多个数据块,每个数据块存储在不同的分片服务器上。
- MongoDB 使用分片键来确定数据的分布,分片键可以是文档中的一个或多个字段。查询时,MongoDB 会根据分片键将查询路由到相应的分片服务器上。
三、以物联网存储实时数据为例讲解 MongoDB 的使用
-
设计数据模型:
- 对于物联网实时数据,可以创建一个名为“sensor_data”的集合来存储传感器数据。每个文档可以包含传感器的标识、时间戳、测量值等字段。
- 例如:
{"sensor_id": "sensor1","timestamp": ISODate("2024-10-12T10:00:00Z"),"temperature": 25.5,"humidity": 60 } -
插入数据:
- 使用 MongoDB 的驱动程序或命令行工具,可以将实时数据插入到数据库中。例如,使用 Python 的 pymongo 库:
from pymongo import MongoClientclient = MongoClient('mongodb://localhost:27017/') db = client['iot_data'] collection = db['sensor_data']data = {"sensor_id": "sensor1","timestamp": datetime.utcnow(),"temperature": 26.5,"humidity": 65 }collection.insert_one(data) -
查询数据:
- 可以使用 MongoDB 的查询语言来查询特定传感器的数据或满足特定条件的数据。例如,查询传感器“sensor1”的所有数据:
result = collection.find({"sensor_id": "sensor1"}) for doc in result:print(doc) -
建立索引:
- 为了提高查询性能,可以根据经常查询的字段建立索引。例如,为“sensor_id”和“timestamp”字段建立复合索引:
collection.create_index([("sensor_id", 1), ("timestamp", 1)]) -
数据聚合和分析:
- MongoDB 提供了强大的聚合框架,可以对数据进行统计、分组、排序等操作。例如,计算某个时间段内传感器的平均温度:
pipeline = [{"$match": {"sensor_id": "sensor1","timestamp": {"$gte": datetime(2024, 10, 12, 10, 0, 0),"$lt": datetime(2024, 10, 12, 11, 0, 0)}}},{"$group": {"_id": None,"average_temperature": {"$avg": "$temperature"}}} ]result = collection.aggregate(pipeline) print(result.next())
通过以上步骤,可以使用 MongoDB 有效地存储和处理物联网实时数据。根据实际需求,可以进一步优化数据模型、索引和查询,以提高系统的性能和可用性。
二、以下是使用 Java 代码以物联网存储实时数据为例展示 MongoDB 的使用方法:
1、添加依赖
如果使用 Maven 项目,在pom.xml文件中添加以下依赖:
<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.12.11</version>
</dependency>
2、代码示例
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;import java.util.Date;public class MongoDBIoTExample {public static void main(String[] args) {// 创建 MongoDB 连接MongoClient mongoClient = new MongoClient("localhost", 27017);// 选择数据库MongoDatabase database = mongoClient.getDatabase("iot_data");// 选择集合MongoCollection<Document> collection = database.getCollection("sensor_data");// 模拟物联网传感器数据Document sensorData = new Document().append("sensor_id", "sensor1").append("timestamp", new Date()).append("temperature", 25.5).append("humidity", 60);// 插入数据到集合中collection.insertOne(sensorData);System.out.println("数据插入成功!");// 查询特定传感器的数据Document query = new Document("sensor_id", "sensor1");collection.find(query).forEach(document -> System.out.println(document.toJson()));// 关闭连接mongoClient.close();}
}
在这个示例中,首先创建了一个到本地 MongoDB 服务器的连接。然后选择了名为iot_data的数据库和名为sensor_data的集合。接着模拟了一个物联网传感器的数据,并将其插入到集合中。最后,通过查询特定传感器的 ID 来检索数据并打印输出。
三、聚合管道的概念
在 MongoDB 中,聚合管道是一种强大的工具,用于对数据进行复杂的分析和转换。以下是使用 MongoDB 的聚合管道进行数据分析的步骤:
聚合管道是由多个阶段组成的流水线,每个阶段对输入数据进行特定的操作,并将结果传递给下一个阶段。聚合管道可以处理大量的数据,并提供了丰富的操作,如过滤、分组、排序、计算聚合值等。
1、基本的聚合管道操作
-
$match阶段:用于过滤文档,只选择符合特定条件的文档进入管道的下一个阶段。- 例如,选择温度大于 25 的传感器数据:
{ $match: { temperature: { $gt: 25 } } } -
$group阶段:用于将文档分组,并对每组文档进行聚合操作。- 例如,按传感器 ID 分组并计算平均温度:
{$group: {_id: "$sensor_id",averageTemperature: { $avg: "$temperature" }} } -
$sort阶段:用于对文档进行排序。- 例如,按时间戳升序排序:
{ $sort: { timestamp: 1 } } -
$project阶段:用于选择和重命名字段,以及进行计算和转换。- 例如,选择特定字段并计算温度差:
{$project: {sensor_id: 1,temperatureDifference: { $subtract: [ "$temperature", 25 ] }} }
使用 Java 驱动程序执行聚合管道
以下是使用 Java 驱动程序执行聚合管道的示例代码:
import com.mongodb.MongoClient;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;import java.util.Arrays;public class MongoDBAggregationExample {public static void main(String[] args) {// 创建 MongoDB 连接MongoClient mongoClient = new MongoClient("localhost", 27017);// 选择数据库MongoDatabase database = mongoClient.getDatabase("iot_data");// 选择集合MongoCollection<Document> collection = database.getCollection("sensor_data");// 定义聚合管道AggregateIterable<Document> result = collection.aggregate(Arrays.asList(new Document("$match", new Document("temperature", new Document("$gt", 25))),new Document("$group", new Document("_id", "$sensor_id").append("averageTemperature", new Document("$avg", "$temperature"))),new Document("$sort", new Document("averageTemperature", -1))));// 遍历结果for (Document document : result) {System.out.println(document.toJson());}// 关闭连接mongoClient.close();}
}
在这个示例中,首先创建了一个到本地 MongoDB 服务器的连接,并选择了名为iot_data的数据库和sensor_data集合。然后定义了一个聚合管道,包括过滤温度大于 25 的文档、按传感器 ID 分组并计算平均温度、按平均温度降序排序。最后,遍历结果并打印输出。
复杂的聚合操作
聚合管道还可以进行更复杂的操作,如嵌套分组、使用表达式进行计算、连接多个集合等。例如,可以使用$lookup阶段进行左外连接操作,将两个集合的数据关联起来进行分析。
以下是一个使用$lookup进行关联的示例:
{$lookup: {from: "sensor_metadata",localField: "sensor_id",foreignField: "sensor_id",as: "sensor_metadata"}
},
{$unwind: "$sensor_metadata"
},
{$project: {sensor_id: 1,temperature: 1,location: "$sensor_metadata.location"}
}
在这个示例中,假设存在另一个名为sensor_metadata的集合,包含传感器的元数据信息(如位置)。通过$lookup阶段将sensor_data集合与sensor_metadata集合进行关联,然后使用$unwind阶段将关联后的结果展开,最后使用$project阶段选择需要的字段。
通过灵活运用 MongoDB 的聚合管道,可以对数据进行各种复杂的分析和转换,满足不同的数据分析需求。
相关文章:
MongoDB 介绍
一、MongoDB 介绍 MongoDB 是一个开源的、面向文档的数据库管理系统。它采用了灵活的数据模型,以类似 JSON 的文档形式存储数据,具有高可扩展性、高性能和丰富的功能。 主要特点包括: 灵活的数据模型:文档型数据库允许存储不同…...
计算机网络:物理层 —— 物理层概述
文章目录 物理层功能物理层接口特性常见特性 相关概念 物理层(Physical Layer)是OSI(Open Systems Interconnection)模型的第一层,负责提供原始比特流传输的服务。它定义了硬件接口的电气、机械、功能和过程特性&#…...
HTTP的工作原理
HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一,被广泛用于万维网上的数据通信。(超文本(Hypertext)是用超链接的方法,将各种不同空间的文字信息组…...
缓存数据减轻服务器压力
问题:不是所有的数据都需要请求后端的 不是所有的数据都需要请求后端的,有些数据是重复的、可以复用的解决方案:缓存 实现思路:每一个分类为一个key,一个可以下面可以有很多菜品 前端是按照分类查询的,所以我们需要通过分类来缓存缓存代码 /*** 根据分类id查询菜品** @pa…...
【自动驾驶】控制算法(十二)横纵向综合控制 | 从理论到实战全面解析
写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…...
Python基础之List列表用法
1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]:获取数组的第2个元素。 names[1:3]:获取数组的第2、第3个元素。包含左侧,不包含右侧。 names[:3]等同于names[0:3]&…...
视觉检测开源库-功能包框架搭建
chapt9/chapt9_ws/src,接着在目录下新建 yolov5_ros2 功能包,并添加相关依赖,完整命令如下: ros2 pkg create yolov5_ros2 --build-type ament_python --dependencies rclpy yolov5 cv_bridge sensor_msgs vision_msgs cv2 --lic…...
pytest的基础入门
pytest判断用例的成功或者失败 pytest识别用例失败时会报AssertionError或者xxxError错误,当捕获异常时pytest无法识别到失败的用例 pytest的fixture夹具 pytest的参数化 #coding:utf-8 import pytestfrom PythonProject.pytest_test.funcs.guess_point import ge…...
(31)非零均值信号的时域分析:均值、方差、与功率
文章目录 前言一、使用MATLAB生成余弦波并画图二、计算信号的均值、方差、与功率三、结果分析 前言 本文对叠加了直流分量的一段整周期余弦信号进行时域分析,使用MATLAB进行信号生成,并计算其均值、方差、与功率。最后给出对计算结果的分析,…...
架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法
昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题,就是在服务器外网架设时,建好角色点开始游戏提示此服务器满员,这个问题一般比较少见,而且出现的话一般都是GEE引擎的版本。 他折腾了半天,一直没进游戏&#x…...
QT day06
在QT使用数据库实现学生管理系统 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlRecord> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…...
微信小程序-npm支持-如何使用npm包
文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…...
Spring Cloud Stream 3.x+kafka 3.8整合
Spring Cloud Stream 3.xkafka 3.8整合,文末有完整项目链接 前言一、如何看官方文档(有深入了解需求的人)二、kafka的安装tar包安装docker安装 三、代码中集成创建一个测试topic:testproducer代码producer配置(配置的格式,上篇文章…...
JavaScript中的数组
1.数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问/获取方式数组是指一组数据的集合,其中每个数据称之为元素(element),在数组中可以存放任意类型的元素,数组是一种将一组数据存储在单个变量名下的优雅方式。 2.…...
UE5运行时动态加载场景角色动画任意搭配-场景角色相机动画音乐加载方法(三)
1、将场景打包为Pak并加载 1、参考这篇文章将场景打包为pak,UE4打包并加载Pak-Windows/iOS/Android不同平台Editor/Runtime不同运行模式兼容 2、在Mount Pak后直接打开Map即可 void UMapManager::OpenMap(FString Path) {UWorld* World = UGlobalManager::GetInstance()->…...
c# 中 中文、英文、数字、空格、标点符号占的字符大小
在C#中,中文、英文、数字、空格和标点符号在不同编码下所占的字节大小是不一样的。常见的编码有UTF-8、UTF-16、GB2312等。以下是在不同编码下各种字符类型所占的字节大小: UTF-8: 中文字符:3个字节 英文字符:1个字…...
前端_003_js扫盲
文章目录 var,let,const严格模式数据类型运算符事件常用对象函数绑定call() ,apply(),bind() 闭包浏览器中事件循环回调和异步Promiseasync和await DOMBOMAjax var,let,const let是var的升级版本,对于块作用域,var无法进行限制,let不会存在该…...
ValueError: You cannot perform fine-tuning on purely quantized models.
在使用peft 微调8bit 或者4bit 模型的时候,可能会报错: You cannot perform fine-tuning on purely quantized models. Please attach trainable adapters on top of the quantized model to correctly perform fine-tuning. Please see: https://huggi…...
DELL R720服务器阵列数据恢复,磁盘状态为Foreign
服务器无法正常进入系统,物理磁盘状态变成了Foreign 虚拟磁盘状态变成了Failed 阵列已经丢失了,需要手工强制导入外部配置 单击 Main Menu 屏幕上的 Configuration Management。单击 Manage Foreign Configuration 单击 Preview Foreign Configurati…...
VMDK 0X80BB0005 VirtualBOX虚拟机错误处理-数据恢复——未来之窗数据恢复
打开虚拟盘文件in7.vmdk 失败. Could not get the storage format of the medium 7\win7.vmdk (VERR_NOT_SUPPORTED). 返回 代码:VBOX_E_IPRT_ERROR (0X80BB0005) 组件:MediumWrap 界面:IMedium {a a3f2dfb1} 被召者:IVirtualBox {768 cd607} 被召者 RC:VBOX_E_OBJECT_NOT_F…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
