详谈MongoDB的那些事

news2024/11/25 6:58:22

在这里插入图片描述

概念区分

什么是关系型数据库

关系型数据库(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.coloradmin.cn/o/874519.html

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

相关文章

TypeScript 语法

环境搭建 以javascript为基础构建的语言&#xff0c;一个js的超集&#xff0c;可以在任何支持js的平台中执行&#xff0c;ts扩展了js并且添加了类型&#xff0c;但是ts不能被js解析器直接执行&#xff0c;需要编译器编译为js文件&#xff0c;然后引入到 html 页面使用。 ts增…

Python批量给excel文件加密

有时候我们需要定期给公司外部发邮件&#xff0c;在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。    python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…

推荐几款流行的项目管理系统,助力高效团队协作!

项目式管理是目前非常流行的企业管理方法&#xff0c;这种方法让是如何在确保时间、技术、经费和性能指标的条件下&#xff0c;以尽可能高的效率完成预定目标&#xff0c;让所有与企业相关方满意。在这种模式下&#xff0c;团队的层次关系不再那么重要&#xff0c;大家以项目结…

第一百二十八天学习记录:数据结构与算法基础:栈和队列(上)(王卓教学视频)

栈和队列的定义和特点 1、栈和队列是两种常用的、重要的数据结构 2、栈和队列是限定插入和删除只能在表的“端点”进行的线性表 线性表可以在任意一个位置插入和删除&#xff0c;栈只能在最后位置插入和删除 队列 只能删除第一个元素 栈和队列是线性表的子集&#xf…

测试开发探索:“WeTalk“网页聊天室的测试流程与自动化

目录 引言&#xff1a; 测试开发目标&#xff1a; "WeTalk"项目背景 关于登录测试用例的设计 测试开发策略与流程 集成测试&#xff1a;Selenium JUnit 接口测试&#xff1a;Postman 测试用例的设计与实现 自动化测试演示&#xff1a; 用例一&#xff1a;登…

【Linux操作系统】深入理解Linux系统编程中的传入参数、传出参数和传入传出参数

在Linux系统编程中&#xff0c;函数的参数扮演着至关重要的角色。参数的传递方式可以分为传入参数、传出参数和传入传出参数。本文将详细解释这三种参数的概念、特点以及如何使用它们来实现灵活和高效的函数调用和数据传递。 文章目录 1. 解释和举例1.1 传入参数&#xff08;i…

案例15 Spring Boot入门案例

1. 选择Spring Initializr快速构建项目 ​ 2. 设置项目信息 ​ 3. 选择依赖 ​ 4. 设置项目名称 ​ 5. 项目结构 ​ 6. 项目依赖 自动配置了Spring MVC、内置了Tomcat、配置了Logback(日志)、配置了JSON。 ​ 7. 创建HelloController类 com.wfit.boot.hello目录下创建HelloCo…

NO.3 MyBatis获取参数的两种方式

目录 1、两种方式的区别 2、单个字面量类型的参数 2.1 在映射文件中&#xff0c;用#{}加任意名称获取参数的值&#xff1a; 2.2 在映射文件中&#xff0c;用${}加任意名称获取参数的值&#xff1a; 2.3 小结 3、在map集合类型的参数 3.1 使用MyBatis默认的map映射集合 …

delphi11中的自动启动和关闭unigui应用服务器

1、设置。 注意&#xff1a;全部。 taskkill /f /im $(OUTPUTFILENAME) 2>1 || exit /B 0 自动运行chrome打开unigui网页 unit ServerModule;interfaceuses Winapi.ShellAPI, vcl.Dialogs;typeTUniServerModule class(TUniGUIServerModule)procedure UniGUIServerModu…

不一般的自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求&#xff0c;是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性&#xff0c;难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

spring源码核心

spring创建bean的生命周期&#xff08;大概&#xff09; 容器 可以理解容器为一个Map<beanName, bean对象> 通过类的构造方法创建对象 有两个有参构造方法&#xff0c;就坏了&#xff0c;spring不知道用哪个&#xff0c;这个时候可以加**Autowired** 有无参和有参时…

运营商二要素认证API接口:提供手机号实名验证服务,确保用户信息的真实性

随着互联网的快速发展&#xff0c;各行各业都需要用户进行实名认证。其中&#xff0c;涉及到用户个人信息的场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景&#xff0c;必须要进行实名认证。然而&#xff0c;对于这些场景&#xff0c;用户的个人信息的真实…

04_14缺页异常,虚拟空间加深印象,匿名页,文件页

前言 写代码想知道某段时间内存够不够用 想更清楚高低水位 清楚虚拟ram和物理ram的关系 CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、I0设备等等, 但从CPU发出的访问 地址并非是这些外设在地址总线上的物理地址&#xff0c; 而一个虚拟地址&#xff0c…

idea集成chatGPT,免费使用的bito神器

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

Springboot整合RabbitMq,详细使用步骤

Springboot整合RabbitMq&#xff0c;详细使用步骤 1 添加springboot-starter依赖2 添加连接配置3 在启动类上添加开启注解EnableRabbit4 创建RabbitMq的配置类&#xff0c;用于创建交换机&#xff0c;队列&#xff0c;绑定关系等基础信息。5 生产者推送消息6 消费者接收消息7 生…

优化堆排序(Java 实例代码)

目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码&#xff1a; 优化堆排序 上一节的堆排序&#xff0c;我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节&#xff0c;我们进行优化&#xff0c;使用原地堆排序。 对于一个最大堆&#xff0c;首…

Azure概念介绍

云计算定义 云计算是一种使用网络进行存储和处理数据的计算方式。它通过将数据和应用程序存储在云端服务器上&#xff0c;使用户能够通过互联网访问和使用这些资源&#xff0c;而无需依赖于本地硬件和软件。 发展历史 云计算的概念最早可以追溯到20世纪60年代的时候&#x…

阿里云Alibaba Cloud Linux镜像系统介绍_常见问题解答FAQ

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

数据统计与可视化的Dash应用程序

在数据分析和可视化领域&#xff0c;Dash是一个强大的工具&#xff0c;它结合了Python中的数据处理库&#xff08;如pandas&#xff09;和交互式可视化库&#xff08;如Plotly&#xff09;以及Web应用程序开发框架。本文将介绍如何使用Dash创建一个简单的数据统计和可视化应用程…

SpringBoot复习:(44)MyBatisAutoConfiguration

可以看到MyBatisAutoConfiguration引入了MyBatisProperties这个属性&#xff1a; MyBatisAutoConfiguration中配置了一个SqlSessionFactoryBean,代码如下&#xff1a; 可以配置mybatis-config.xml,需要配置文件里指定&#xff1a; mybatis.config-locationclasspath:/mybat…