详谈MongoDB的那些事

在这里插入图片描述

概念区分

什么是关系型数据库

关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS)。在关系型数据库中,数据以表格的形式存储,表格由行和列组成,行表示数据记录,列表示数据字段。每个表格都有一个唯一的标识符,称为主键,用于唯一标识表中的每一行。

关系型数据库的核心概念包括:

  1. 表格(Table):数据以表格的形式组织,每个表格具有名称和一组定义了数据类型的列。表格表示实体(如人、物、事件等)以及实体之间的关系。

  2. 行(Row):表格中的每一行代表一个数据记录,包含了不同字段的数据值。

  3. 列(Column):表格中的每一列代表一个数据字段,定义了数据的类型和格式。

  4. 主键(Primary Key):每个表格都有一个主键,用于唯一标识表中的每一行。主键确保数据的唯一性和完整性。

  5. 外键(Foreign Key):外键用于在不同表格之间建立关联,表示表格之间的关系。外键通常引用其他表格的主键。

  6. SQL(Structured Query Language):关系型数据库使用SQL来进行数据查询、插入、更新和删除操作。SQL是一种标准化的查询语言,用于与关系型数据库交互。

关系型数据库的一些常见示例包括:

  • MySQL
  • PostgreSQL
  • Oracle Database
  • Microsoft SQL Server
  • SQLite

关系型数据库以其结构化的数据模型和广泛的应用领域而闻名。它们适用于需要复杂数据关系和丰富查询的应用,如企业应用、金融系统、人力资源管理等。然而,随着数据的不断增长和应用场景的多样化,出现了许多其他类型的数据库,如NoSQL数据库,用于处理非结构化和半结构化数据,而且本文讲到的MongoDB就属于非关系型数据库,也是改文章的主角。

什么是非关系型数据库

非关系型数据库(NoSQL,Not Only SQL)是一类数据库管理系统(DBMS),与传统的关系型数据库相比,它们采用不同的数据模型和存储机制。非关系型数据库适用于处理大规模、高度分布式、非结构化或半结构化数据,以及需要更高的可扩展性和灵活性的应用场景。

非关系型数据库的主要特点包括:

  1. 数据模型多样性:非关系型数据库支持多种数据模型,例如键值对、文档、列族、图形等,以适应不同类型的数据。

  2. 分布式架构:许多非关系型数据库具有分布式架构,可以水平扩展,将数据分布在多台服务器上,以实现高可用性和更好的性能。

  3. 灵活的模式:非关系型数据库通常不需要严格的表结构定义,允许在数据存储过程中动态添加、修改字段,从而适应数据模式的变化。

  4. 高可扩展性:由于其分布式性质,非关系型数据库能够轻松地扩展以处理大量数据和高并发请求。

  5. 适应大数据:非关系型数据库通常用于存储和处理大规模的数据,如社交媒体数据、日志文件、传感器数据等。

常见的非关系型数据库类型包括:

  1. 键值存储(Key-Value Stores):数据以键值对的形式存储,适用于高速读写操作,如Redis、Amazon DynamoDB。

  2. 文档数据库(Document Stores):数据以类似JSON或XML格式的文档存储,适用于半结构化数据,如MongoDB、Couchbase。

  3. 列族数据库(Column Family Stores):数据以列族的形式存储,适用于大规模分布式数据,如Apache Cassandra、HBase。

  4. 图形数据库(Graph Databases):用于存储和查询图形数据,适用于复杂的数据关系,如Neo4j、Amazon Neptune。

  5. 时间序列数据库(Time Series Databases):专门用于存储时间序列数据,如传感器数据、日志数据等,如InfluxDB、OpenTSDB。

  6. 搜索引擎(Search Engines):用于全文搜索和数据分析,如Elasticsearch、Solr。

非关系型数据库在现代应用开发中变得越来越重要,特别是在大数据、云计算和分布式系统领域,此次之所以介绍MongoDB数据库,也是由于系统开发需求中要求对于聊天记录做到保存,鉴于数据量较大,所以考虑到了MongoDB架构。

主角MongoDB介绍

MongoDB是一种开源、面向文档的非关系型数据库管理系统(NoSQL DBMS),它以其灵活性、可扩展性和强大的查询能力而闻名。MongoDB的设计理念是为了满足现代应用中海量数据、高可用性和复杂数据模型的需求。以下是MongoDB的一些重要特点和概念:

  1. 文档数据库:MongoDB使用文档(Document)来表示数据,文档类似于JSON格式的数据结构,可以包含各种类型的数据,如字符串、数字、日期、数组和嵌套文档等。

  2. 面向文档:MongoDB是一种面向文档的数据库,每个文档都有一个唯一的标识符(通常称为_id),用于唯一标识文档。

  3. 高可扩展性:MongoDB支持水平扩展,可以通过分片(Sharding)将数据分布到多台服务器上,以实现更高的存储容量和性能。

  4. 动态模式:MongoDB不需要严格的表结构定义,文档可以自由添加和修改字段,适应数据模式的变化。

  5. 强大的查询语言:MongoDB支持丰富的查询语言,可以进行复杂的查询操作,包括过滤、排序、投影、聚合等。

  6. 索引支持:MongoDB支持各种类型的索引,包括单字段索引、复合索引、文本索引、地理空间索引等,以加速查询操作。

  7. 复制和高可用性:MongoDB支持数据的复制和自动故障转移,确保数据的高可用性和冗余。

  8. 数据存储:MongoDB将数据存储在集合(Collection)中,每个集合包含一组文档。集合类似于关系型数据库中的表格。

  9. 适用场景:MongoDB适用于需要存储和处理半结构化或非结构化数据的场景,如大数据、实时数据分析、内容管理系统、日志记录和用户个性化推荐等。

MongoDB安装介绍

Centos安装MongoDB

以下是在CentOS上安装MongoDB的详细步骤:

  1. 更新系统:
    打开终端,并以root或具有sudo权限的用户身份登录,首先更新系统软件包以确保系统处于最新状态:
sudo yum update
  1. 添加MongoDB仓库:
    MongoDB提供了官方的YUM仓库,可以使用以下步骤将其添加到您的系统中:
sudo vi /etc/yum.repos.d/mongodb-org.repo

在编辑器中,添加以下内容(保存并退出编辑器):

[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
  1. 安装MongoDB:
    使用以下命令安装MongoDB软件包:
sudo yum install -y mongodb-org
  1. 启动MongoDB服务:
    安装完成后,您可以启动MongoDB服务,并设置其开机自启动:
sudo systemctl start mongod
sudo systemctl enable mongod
  1. 验证MongoDB是否已正确启动:
    运行以下命令来验证MongoDB是否已成功启动:
sudo systemctl status mongod

您应该看到MongoDB服务状态为"active (running)"。

  1. 连接到MongoDB Shell:
    使用MongoDB Shell与数据库交互,运行以下命令:
mongo

这将连接到本地MongoDB服务器的Shell。

docker安装MongoDB

大家知道我的习惯,肯定少不了docker的安装方式啊
安装MongoDB并在Docker容器中运行它是一个方便的方式,让我们详细介绍一下如何在Docker中安装和运行MongoDB。

  1. 安装Docker

    如果您尚未安装Docker,请按照以下步骤在您的操作系统上安装Docker:

    • 对于Linux用户,您可以根据您的发行版选择适当的安装方式,通常是使用包管理工具(如aptyum)来安装Docker。
    • 对于Windows用户,您可以从Docker官方网站下载并运行安装程序。
    • 对于macOS用户,您可以从Docker官方网站下载并运行Docker Desktop安装程序。
  2. 拉取MongoDB镜像

    打开终端(或命令行界面)并执行以下命令,以从Docker Hub拉取MongoDB官方镜像:

    docker pull mongo
    
  3. 运行MongoDB容器

    使用以下命令来创建并运行MongoDB容器。这将创建一个名为"my-mongodb"的MongoDB容器,并将其绑定到主机的27017端口。可以根据需要自行调整容器名称和端口绑定。

    docker run --name my-mongodb -p 27017:27017 -d mongo
    

    此命令将以后台模式运行MongoDB容器。要停止容器,可以使用docker stop命令:

    docker stop my-mongodb
    

    要删除容器,可以使用docker rm命令:

    docker rm my-mongodb
    
  4. 连接到MongoDB容器

    要连接到运行中的MongoDB容器的Mongo shell,可以使用以下命令:

    docker exec -it my-mongodb mongo
    

    这将进入Mongo shell,可以在其中执行MongoDB命令。

Win系统安装MongoDB

要在Windows系统上安装MongoDB,请按照以下步骤操作:

  1. 下载MongoDB安装包:
    前往MongoDB官方网站(https://www.mongodb.com/try/download/community-kubernetes-operator)下载最新版本的MongoDB安装包。确保选择与您的操作系统相匹配的版本。
    在这里插入图片描述

  2. 安装MongoDB:
    双击下载的安装包,按照安装向导指示完成安装过程。您可以选择自定义安装选项,但对于大多数用户来说,使用默认选项即可。

  3. 配置MongoDB环境变量:
    将MongoDB的安装路径添加到系统的环境变量中,以便在任何目录下都可以通过命令行访问MongoDB。将安装路径(默认为C:\Program Files\MongoDB\Server<版本号>\bin)添加到您的系统环境变量中的Path变量中。

  4. 创建数据目录:
    在您选择的位置上创建一个数据目录,用于存储MongoDB的数据文件。例如,您可以在C:\data目录下创建一个名为db的文件夹。

  5. 配置MongoDB服务:
    打开命令提示符(CMD)或PowerShell,并导航到MongoDB的安装目录(例如:C:\Program Files\MongoDB\Server<版本号>\bin)。

    运行以下命令来启动MongoDB服务器:

    mongod --dbpath <数据目录路径>
    

    请将<数据目录路径>替换为您在第4步中创建的数据目录的路径。

  6. 连接到MongoDB:
    打开另一个命令提示符或PowerShell窗口,导航到MongoDB的安装目录(例如:C:\Program Files\MongoDB\Server<版本号>\bin)。

    运行以下命令来连接到MongoDB:

    mongo
    

请注意,如果不按照如上步骤操作,而是直接在安装目录执行exe
在这里插入图片描述

那就需要再D盘根路径创建一个/data/db目录,否则会闪退!!!
在这里插入图片描述

MongoDB是默认没有写入环境变量的,大家需要自己配置,不再赘述!!!

MongoDB使用介绍

在MongoDB中,建立集合(类似于关系型数据库中的表)是动态的,因此无需像关系型数据库那样显式地定义表结构。只需插入文档(类似于关系型数据库中的记录),MongoDB将自动创建集合并根据文档的结构来定义字段。命令执行我们可以使用Navicat工具进行连接
在这里插入图片描述

以下是MongoDB中创建集合和插入文档的语法和示例:

简单使用

  1. 创建集合并插入文档:
// 使用insertOne插入文档并创建集合
db.collectionName.insertOne({ field1: "value1", field2: "value2", ... })

示例:

db.students.insertOne({ name: "李红", age: 25, major: "Computer Science" })
db.students.insertOne({ name: "张飞", age: 22, major: "Biology" })

在这里插入图片描述

  1. 查询集合中的文档:
// 查询集合中的所有文档
db.collectionName.find()// 查询特定条件的文档
db.collectionName.find({ field: "value" })

示例:

// 查询所有学生
db.students.find()// 查询年龄大于等于 25 岁的学生
db.students.find({ age: { $gte: 25 } })
  1. 更新文档:
// 使用updateOne更新单个文档
db.collectionName.updateOne({ condition }, { $set: { field: "new value" } })// 使用updateMany更新多个文档
db.collectionName.updateMany({ condition }, { $set: { field: "new value" } })

示例:

// 更新学生的专业
db.students.updateOne({ name: "张飞" }, { $set: { major: "Engineering" } })
  1. 删除文档:
// 使用deleteOne删除单个文档
db.collectionName.deleteOne({ condition })// 使用deleteMany删除多个文档
db.collectionName.deleteMany({ condition })

示例:

// 删除专业为"Biology"的学生
db.students.deleteMany({ major: "Biology" })

我们再举一个例子,假设正在开发一个简单的博客平台,可以使用MongoDB来存储博客帖子和评论。在这个复杂业务的示例中,我们将涵盖以下方面:

  1. 创建集合和插入文档
  2. 查询和筛选数据
  3. 更新文档
  4. 使用索引

1. 创建集合和插入文档:

首先,我们创建一个集合来存储博客帖子,每个帖子包含标题、内容和发布日期:

// 创建博客集合并插入帖子文档
db.blogPosts.insertOne({title: "MongoDB的相关介绍   ——IT小辉同学",content: "MongoDB 是一个非关系型数据库",publishDate: new Date("2023-08-01"),comments: []
})

2. 查询和筛选数据:

现在,我们查询博客集合中的帖子并筛选出发布日期在特定范围内的帖子:

// 查询发布日期在特定范围内的帖子
db.blogPosts.find({publishDate: { $gte: new Date("2023-08-01"), $lt: new Date("2023-08-10") }
})

3. 更新文档:

假设一篇帖子收到了一条新评论,我们可以将评论添加到帖子的评论数组中:

// 更新帖子,添加新评论
db.blogPosts.updateOne({ title: "MongoDB的相关介绍,很有意思奥   ——IT小辉同学" },{$push: {comments: {author: "User123",text: "MongoDB,我们一起学习!",timestamp: new Date()}}}
)

4. 使用索引:

为了提高查询性能,我们可以创建索引以加速某些查询操作。例如,为了加速根据标题搜索帖子的查询,我们可以创建标题字段的索引:

// 创建标题字段的索引
db.blogPosts.createIndex({ title: "text" })

这是一个简化的示例,展示了如何在MongoDB中处理博客帖子和评论的复杂业务场景。实际业务中可能还需要处理更多情况,如用户认证、数据验证、用户关系等。MongoDB的灵活性和功能可以适应各种复杂的业务需求。

请注意,MongoDB的语法使用了JSON,也就是我们Java常说的对象,因此数据和查询都是使用JSON的形式。

复杂语法

当您需要进行更复杂的增删改查操作时,MongoDB提供了丰富的查询、更新和聚合功能来满足您的需求。以下是更复杂的示例,涵盖了多条件查询、更新和聚合操作:

1. 多条件查询:

假设您要查询发布日期在特定范围内,同时标题包含特定关键词的帖子:

db.blogPosts.find({publishDate: { $gte: new Date("2023-08-01"), $lt: new Date("2023-08-10") },title: { $regex: "MongoDB" }
})

2. 多条件更新:

更新帖子的评论,将指定作者的所有评论中的文本替换为新文本:

db.blogPosts.updateMany({ "comments.author": "User123" },{ $set: { "comments.$[].text": "新文本" } }
)

3. 使用聚合:

聚合操作允许您进行数据处理和转换。假设您要计算每篇帖子的评论数量并按评论数量降序排序:

db.blogPosts.aggregate([{$project: {title: 1,numberOfComments: { $size: "$comments" }}},{$sort: { numberOfComments: -1 }}
])

以上代码使用聚合管道,首先通过$project将每篇帖子的标题和评论数量提取出来,然后通过$sort按评论数量降序排序。

4. 删除多个文档:

假设您要删除评论数低于指定值的所有帖子:

db.blogPosts.deleteMany({comments: { $size: { $lt: 5 } }
})

这将删除所有评论数少于5条的帖子。

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

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

相关文章

PAT 1018 Public Bike Management

个人学习记录&#xff0c;代码难免不尽人意。 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Pu…

Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题

目录 引出手动实现ArrayList定义接口MyList<T>写ArrayList的实现类增加元素删除元素 写测试类进行测试数组插入数据? 总结 引出 1.ArrayList的结构分析&#xff0c;可迭代接口&#xff0c;是List的实现&#xff1b; 2.数组增加元素和删除元素的分析&#xff0c;何时扩容…

煤矿调度IP语音对讲广播模块一键求助对讲矿用调度通信系统SIP语音对讲求助终端

硬件接口描述 SV-2101VP/ SV-2103VP系列网络音频模块&#xff0c;所有外部连接采用端子&#xff0c;电源采用2.0mm的端子&#xff0c;网络采用标准RJ45连接器&#xff0c;其他都是1.25mm的连接器。 端口类型定义 P ———— 电源 AI ———— 模拟输入&#xff08;在这里是音…

《人工智能大模型体验报告2.0》发布

ChatGPT 崛起引发新一轮生成式AI热潮&#xff0c;国内科技企业纷纷布局。据不完全统计&#xff0c;截至目前&#xff0c;国内大模型数量已达上百个。在这些大模型中&#xff0c;谁的表现最好&#xff0c;智能性最高&#xff0c;用户体验最强&#xff1f;8月12日&#xff0c;新华…

谈谈召回率(R值),准确率(P值)及F值

通俗解释机器学习中的召回率、精确率、准确率&#xff0c;一文让你一辈子忘不掉这两个词 赶时间的同学们看这里&#xff1a;提升精确率是为了不错报、提升召回率是为了不漏报 先说个题外话&#xff0c;暴击一下乱写博客的人&#xff0c;网络上很多地方分不清准确率和精确率&am…

仿牛客论坛项目day7|Kafka

一、阻塞队列 创建了一个生产者线程和一个消费者线程。生产者线程向队列中放入元素&#xff0c;消费者线程从队列中取出元素。我们可以看到&#xff0c;当队列为空时&#xff0c;消费者线程会被阻塞&#xff0c;直到生产者线程向队列中放入新的元素。 二、Kafka入门 发布、订阅…

线性代数3,什么是向量 向量空间(草稿,建设ing)

列向量 行向量 4 什么是向量空间&#xff0c;向量的张成空间 域&#xff0c;组等概念 空间 向量空间 张成空间 6 线性代数 普通代数&#xff0c;是以单个的数为研究对象的数学 线性代数本质是以数组&#xff08;数组/向量&#xff1a;多个数为整体&#xff09;为基本对象的…

Mathematica 与 Matlab 常见复杂指令集汇编

Mathematica 常见指令汇编 Mathematica 常见指令 NDSolve 求解结果的保存 sol NDSolve[{y[x] x^2, y[0] 0, g[x] -y[x]^2, g[0] 1}, {y, g}, {x, 0, 1}]; numericSoly sol[[1, 1, 2]]; numericSolg sol[[1, 2, 2]]; data Table[{x, numericSoly[x], numericSolg[x]},…

其他行业跳槽转入计算机领域简单看法

其他行业跳槽转入计算机领域简单看法 本人选择从以下几个方向谈谈自己的想法和观点。 先看一下总体图&#xff0c;下面会详细分析 如何规划才能实现转码 自我评估和目标设定&#xff1a;首先&#xff0c;你需要评估自己的技能和兴趣&#xff0c;确定你希望在计算机领域从事…

机器视觉应用开发什么最重要?

&#xff08;QQ群有答疑&#xff09;零基础小白快速上手海康VisionMaster开发系列课程 高级语言在机器视觉就是工具&#xff0c;机器视觉软件&#xff0c;在机器视觉中也是工具&#xff0c;在机器视觉应用开发中&#xff0c;图像处理是最重要的&#xff0c;一切看图像&#xff…

leetcode做题笔记85最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 思路一&#xff1a;单调栈 int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){int dp[matrixSize…

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…

[C++]笔记 - 知识点积累

一.运算符的优先级 一共15个级别 最高优先级 : () []最低优先级 :逗号表达式倒数第二低优先级 : 赋值和符合赋值(,,-...) ! >算术运算符 > 关系运算符 > && >> || >赋值运算符 二.数据类型转换 隐式类型转换 算数转换 char int long longlong flo…

【NepCTF2023】复现

文章目录 【NepCTF2023】复现MISC与AI共舞的哈夫曼codesc语言获取环境变量 小叮弹钢琴陌生的语言你也喜欢三月七么Ez_BASIC_IImisc参考 WEBez_java_checkinPost Crad For You独步天下配置环境独步天下-镜花水月环境变量提权 独步天下-破除虚妄总结 独步天下-破除试炼_加冕成王知…

Qt应用开发(基础篇)——MDI窗口 QMdiArea QMdiSubWindow

一、前言 QMdiArea类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示MDI窗口的部件。 滚屏区域基类 QAbstractScrollAreahttps://blog.csdn.net/u014491932/article/details/132245486 框架类 QFramehttps://blog.csdn.net/u01…

案例: 用户消费数据分析--Pandas

1. 数据读入 2. 数据处理–日期处理 3. 用户整体消费趋势分析 4. 用户个体消费分析 4.1 用户消费数量与消费金额关系的散点图 4.2 每位用户消费金额分布 4.2.1 消费金额贡献度折线图 用户贡献度折线图 4.2.2 消费金额占比前80%的客户&#xff0c;消费分布直方图 4.3 消费时…

传输层协议

传输层协议 再谈端口号端口号范围划分认识知名端口号两个问题netstatpidof UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议 TCP协议TCP协议段格式确认应答(ACK)机制超时重传机制连接管理机制理解 CLOSE_WAIT 状态理解TIME_WAIT状态解决…

SQL | 分组数据

10-分组数据 两个新的select子句&#xff1a;group by子句和having子句。 10.1-数据分组 上面我们学到了&#xff0c;使用SQL中的聚集函数可以汇总数据&#xff0c;这样&#xff0c;我们就能够对行进行计数&#xff0c;计算和&#xff0c;计算平均数。 目前为止&#xff0c…

鸿蒙剥离 AOSP 不兼容 Android 热门问题汇总,不吹不黑不吵

上周发了一篇 《鸿蒙终于不套壳了&#xff1f;纯血 HarmonyOS NEXT 即将到来》的相关资讯&#xff0c;没想到大家「讨&#xff08;fa&#xff09;论&#xff08;xie&#xff09;」的热情很高&#xff0c;莫名蹭了一波流量&#xff0c;虽然流量对我来说也没什么用&#xff0c;但…

Golang 基础语法问答

使用值为 nil 的 slice、map 会发生什么&#xff1f; 允许对值为 nil 的 slice 添加元素&#xff0c;但是对值为 nil 的 map 添加元素时会造成运行时 panic。 // map错误示例 func main() {var m map[string]intm["one"] 1 // error: panic: assignment to entry …