详谈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.mzph.cn/news/36200.shtml

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

相关文章

神秘的ip地址8.8.8.8,到底是什么类型的DNS服务器?

下午好&#xff0c;我的网工朋友。 DNS&#xff0c;咱们网工配置网络连接或者路由器时&#xff0c;高低得和这玩意儿打交道吧。 它是互联网中用于将人类可读的域名&#xff08;例如http://www.example.com&#xff09;转换为计算机可理解的IP地址&#xff08;例如192.0.2.1&a…

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑

随着“碳达峰、碳中和”目标与建设新型能源体系的提出&#xff0c;在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用&#xff0c;将会促进智能电网的发展&#xff0c;为建设新…

Oracle 知识篇+分区表上的索引由global改为local注意事项

★ 知识点 二、知识点 Local型索引有如下优点 1.Only one index partition must be rebuilt when a maintenance operation other than SPLIT PARTITION or ADD PARTITION is performed on an underlying table partition. 2.The duration of a partition maintenance opera…

【uniapp】使用Vs Code开发uniapp:

文章目录 一、使用命令行创建uniapp项目&#xff1a;二、安装插件与配置&#xff1a;三、编译和运行:四、修改pinia&#xff1a; 一、使用命令行创建uniapp项目&#xff1a; 二、安装插件与配置&#xff1a; 三、编译和运行: 该项目下的dist》dev》mp-weixin文件导入微信开发者…

unity vscode 代码关联 跳转 BUG

一早打开电脑发现代码关联失效了&#xff0c;目测可能跟昨天一些插件更新有关 结论 就这货&#xff0c;开了就没法提示代码关联&#xff0c;估计预览版全是BUG。 另一个坑 同期有个unity插件也是预览版&#xff0c;“非常好使”&#xff0c;当场去世。评论点开有好几个人说用…

替代阿托斯DLKZOR-T/DLHZO-TES直动式伺服阀比例阀

DLKZOR-T/DLKZOR-TES直动式伺服阀比例阀结构&#xff1a; 1&#xff0c;LVDT传感器 2&#xff0c;比例电磁铁 3&#xff0c;阀体 4&#xff0c;阀套 5&#xff0c;阀芯 6&#xff0c;复位弹簧 7&#xff0c;集成数字放大器 8&#xff0c;七芯插头 9&#xff0c;RS232通…

[保研/考研机试] 杨辉三角形 西北工业大学复试上机题 C++实现

题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入n值&#xff0c;使用递归函数&#xff0c;求杨辉三角形中各个位置上的值。 输入描述: 一个大于等于2的整型数n 输出描述: 题目可能有多组不同的测试数据&#xff0c;对于每组输入数据&#xff0c; 按题目的要求输…

15.3.2 【Linux】系统的配置文件:/etc/crontab,/etc/cron.d/*

这个“ crontab -e ”是针对使用者的 cron 来设计的&#xff0c;如果是“系统的例行性任务”时&#xff0c; 该怎么办呢&#xff1f;是否还是需要以 crontab -e 来管理你的例行性工作调度呢&#xff1f;当然不需要&#xff0c;你只要编辑/etc/crontab 这个文件就可以。有一点需…

机器学习终极指南:特征工程(01/2) — 第 -2 部分

西姆兰吉特辛格 一、介绍 欢迎来到“机器学习终极指南”的第二部分。在第一部分中&#xff0c;我们讨论了探索性数据分析 &#xff08;EDA&#xff09;&#xff0c;这是机器学习管道中的关键步骤。在这一部分中&#xff0c;我们将深入研究特征工程&#xff0c;这是机器学习过程…

使用shift关键字,写一个带二级命令的脚本(如:docker run -a -b -c中的run)

省流&#xff1a;shift关键字 探索思路 最近有一个小小的需求&#xff0c;写一个类似于docker run -a -b -c这样的脚本&#xff0c;这个脚本名为doline&#xff0c;它本身可以执行&#xff08;doline -a -b -c&#xff09;&#xff0c;同时又带有几个如run、init、start这样的…

verilog 实现异步fifo

理论知识参考 异步FIFO_Verilog实现_verilog实现异步fifo_Crazzy_M的博客-CSDN博客 代码 /* 位宽8bit, 位深8 */ module async_fifo#(parameter FIFO_DEPTH 8,parameter FIFO_WIDTH 8 ) (input rst_n,input wr_clk,input wr_en,input [FIFO_WIDTH - 1:0…

Chrome小技巧---多用户登录同一网站不串信息

测试中经常需要用到浏览器需要登录多个账号 但是有一个问题就是会串号 通过添加不同的用户再用这用户登录&#xff0c;就不串号了&#xff1a; 还可以在浏览器的偏好设置中添加启动地址 这样每次打开&#xff0c;就进到设置的地址中了

el-table自适应缩放大小

安装依赖 npm install --save vue-draggable-resizable //或 cnpm install --save vue-draggable-resizablemain.js引入依赖 import VueDraggableResizable from vue-draggable-resizable import "vue-draggable-resizable/dist/VueDraggableResizable.css"; Vue.c…

基于Redis实现全局唯一Id

微信公众号访问地址&#xff1a;基于Redis实现全局唯一Id 推荐文章&#xff1a; 1、使用原生Redis命令实现分布式锁 ​ 2、为什么引入Redisson分布式锁&#xff1f; 3、SpringBoot整合多数据源&#xff0c;并支持动态新增与切换&#xff08;详细教程&#xff09; 4、Sprin…

JVM 查看配置 jinfo 及使用 jstat,查看堆栈jstack及GC

1. Jinfo 查看正在运行的Java应用程序的扩展参数: 包含 JVM 参数与 java 系统参数 命令&#xff1a; jinfo pid 2 jstat 查看堆内存使用情况及 GC 回收频率等&#xff1a; jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数] 2.1 jstat -gc pid 最常用&#xff0c;可…

C语言必会题目(2)

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 今天继续分享C语言必会的题目&#xff0c;上一篇文章主要是一些选择题&#xff0c;而今天我们主要内容为编程题的推荐与讲解 准备好迎接下面的题了吗&#xff1f;开始发车了&#xff01;&#xff01;&#xff01; 输入…

OSI参考模型及TCP/IP协议栈

一、网络概述 1.1、什么是网络&#xff1f; 1、网络的本质就是实现资源共享 2、将各个系统联系到一起&#xff0c;形成信息传递、接收、共享的信息交互平台 1.2、典型的园区网拓扑 1.3、网络历史发展&#xff0c;ARPA和ARPANET 1、1969年&#xff0c;美国国防部高级研究计…

前后端分离------后端创建笔记(03)前后端对接(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

创新零售,京东重新答题?

继新一轮组织架构调整后&#xff0c;京东从低价到下沉动作不断。 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合。近日&#xff0c;京喜拼拼已改名为京东拼拼&#xff0c;与七鲜、前置仓等业务共同承载起京东线上线下加速融合的梦想。 同时&#xff0c;拼拼的更…

【从零学习python 】19. 循环遍历列表和列表嵌套的应用

文章目录 列表的循环遍历1. 使用while循环2. 使用for循环3. 交换2个变量的值1. 列表嵌套2. 应用 进阶案例 列表的循环遍历 1. 使用while循环 为了更有效率的输出列表的每个数据&#xff0c;可以使用循环来完成 namesList [xiaoWang,xiaoZhang,xiaoHua] length len(namesLi…