当前位置: 首页 > news >正文

MongoDB初学者入门教学:与MySQL的对比理解

🏝️ 博主介绍

大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~
👨‍🎓 个人介绍本人是一名后端Java开发工程师,坐标北京 ~
🎉 感谢关注 📖 一起学习 📝 一起讨论 🌈 一起进步 ~
🙏 作者水平有限,欢迎各位大佬指正留言,相互学习进步 ~

目录

  • 🏝️ 博主介绍
  • 1. 概述 🚀
  • 2. 数据模型与存储 🚀
  • 3. MongoDB 常用命令 🚀
  • 4. MongoDB 索引 🚀
  • 5. MongoDB的使用场景 🚀
  • 6. SpringBoot 集成 MongoDB 🚀

🌱 在数据库的世界里,MongoDB和MySQL是两种非常流行且功能强大的数据库系统,但它们各自的设计哲学、应用场景以及数据模型存在显著差异。对于数据库初学者来说,了解这些差异有助于更好地选择适合自己的工具,并深入理解数据库的基本原理。本文将带领你踏入MongoDB的世界,并通过与MySQL的对比,帮助你快速上手MongoDB。🍂

1. 概述 🚀

  • MongoDB :MongoDB是一个基于分布式文件存储的开源NoSQL数据库系统,由C++编写而成。与传统的关系型数据库不同,MongoDB采用了面向文档的存储方式,支持“无模式”的数据建模,能够存储比较复杂的数据类型。这使得MongoDB在处理半结构化和非结构化数据时,表现得尤为出色,如日志、社交媒体数据等。MongoDB属于NoSQL(Not Only SQL)数据库的一种。它采用键值存储的方式来存储数据,是一种类似于JSON 的 格式叫BSON(Binary JSON),虽然我们平时看到的文档都是JSON格式呈现,但在内部是以BSON格式存储的。MongoDB特别适合处理大规模数据集高并发读写、以及需要灵活数据模型的应用场景。
  • MySQL:MySQL是一个流行的关系型数据库管理系统(RDBMS),使用标准的SQL语言来管理数据。它遵循ACID(原子性、一致性、隔离性、持久性)原则,适合需要事务处理、强一致性保证和复杂查询的应用场景。

2. 数据模型与存储 🚀

在这里插入图片描述

✨ MongoDB的数据模型:

  • 数据库(Database):包含多个集合,类似于关系型数据库中的数据库。
  • 集合(Collection):集合是文档的集合,相当于关系型数据库中的表,但不需要定义结构。
  • 文档(Document):MongoDB的基本单位是文档,文档是JSON格式的键值对集合,其内部格式为BSON。一个文档可以嵌套其他文档或数组,非常灵活。

✨ MySQL的数据模型:

  • 数据库(Database):数据库是表的容器,提供了命名空间、访问控制和数据完整性的机制
  • 表(Table):由行和列组成的二维数据结构,每列都有固定的数据类型和约束。
  • 行(Row):表中的一条记录。
  • 列(Column):表中的字段,定义了数据的类型和属性。

3. MongoDB 常用命令 🚀

  • 启动MongoDB:首先进入MongoDB目录下创建data/db文件夹,然后进入bin目录下面,执行 mongod --dbpath=../data/db
  • 连接MongoDB:进入MongoDB的bin目录下执行 mongo --host=localhost --port=27017
  • 创建数据库use 数据库

示例:use mydb。如果mydb不存在则创建它,存在则进入该数据库

  • 删除数据库db.dropDatabase()
  • 查看当前数据库db
  • 查看所有数据库show dbs
  • 创建集合db.createCollection("集合")

示例:db.createCollection(“mycollection”)

  • 删除集合db.集合.drop()

示例:db.mycollection.drop()

  • 插入文档(单个)db.集合.insert(json数据)

示例:db.collection_08.insert({“name”:“小张”,“age”:18})

  • 插入文档(多个)db集合.insertMany([json数据]) || db集合.insert([json数据])

示例:db.collection_08.insertMany([{“name”:“小张”,“age”:18},{“name”:“小张”,“age”:18,“hight”:“178cm”}])

  • 查询文档db.集合.find()(示例:db.collection_08.find()
  • 查询指定字段db.集合名.find({}, {"键名1": 1, "键名2": 0})(1表示显示该字段,0表示不显示)
  • 条件查询

等于db.集合名.find({"键名": "值"})

不等于db.集合名.find({ "键名": { "$ne": "值" }})

AND条件db.集合名.find({"键名1": "值1", "键名2": "值2"})

OR条件db.集合名.find({"$or": [{"键名1": "值1"}, {"键名2": "值2"}]})

比较条件(大于、小于等)db.集合名.find({"键名": {"$gt": 值}}),其中$gt表示大于,$lt表示小于,$gte表示大于等于,$lte表示小于等于

IN条件db.集合名.find({"键名": {"$in": ["值1", "值2"]}})

NOT IN条件db.集合名.find({"键名": {"$nin": ["值1", "值2"]}})

模糊匹配(包含)db.集合名.find({"字段名": /值/})

正则表达式匹配(以某个值开头/结尾)db.集合名.find({"字段名": /^值/})db.集合名.find({"字段名": /值$/})

  • 删除所有文档db.集合名.remove({})
  • 删除匹配条件的文档db.集合名.remove({"键名": "值"})
  • 更新匹配到的第一条文档db.集合名.updateOne({查询条件}, {$set: {更新内容}})
  • 更新匹配到的所有文档db.集合名.updateMany({查询条件}, {$set: {更新内容}})
  • 统计db.集合名.count() || db.集合名.count({查询条件})
  • 排序db.集合名.find().sort({"键名": 1})(1为升序,-1为降序)
  • 分页db.集合名.find().skip(N).limit(M)(跳过N条数据,限制返回M条数据)

4. MongoDB 索引 🚀

  • 创建单一索引db.collection.createIndex({ fieldName: 1 })

collection 表示集合名称,fieldName 是你想要索引的字段名,1 表示升序索引(-1 表示降序索引)。

  • 创建复合索引db.collection.createIndex({ fieldName1: 1, fieldName2: -1 })

复合索引可以基于多个字段的顺序来优化查询。

  • 查看索引db.collection.getIndexes()
  • 删除索引db.collection.dropIndex({ fieldName: 1 }) || db.collection.dropIndex(索引名称)
  • 删除所有索引(除了 _id 索引)db.collection.dropIndexes()
  • 索引评估db.collection.find({ fieldName: "value" }).explain() 查询语句后面加 explain()

下面两张图片,第一张是没有使用到索引,第二张是使用到了索引。
在这里插入图片描述
在这里插入图片描述

5. MongoDB的使用场景 🚀

  1. 大数据存储和处理:MongoDB适用于存储和处理大量的非结构化数据,如日志数据、社交媒体数据、传感器数据等。由于其灵活的文档模型,MongoDB能够轻松地处理这些复杂且多变的数据结构。
  2. 实时分析和报表:MongoDB的数据模型和查询语言(MongoDB Query Language,
    MQL)支持复杂的聚合操作和数据分析,适合进行实时数据分析和报表生成。
  3. 高并发读写:MongoDB的异步非阻塞I/O模型和高性能的内存映射文件技术,使其能够应对高并发的读写请求,适用于需要处理大量用户访问和数据更新的应用场景。
  4. 内容管理系统(CMS):MongoDB可以用作内容管理系统的后端数据库,存储和管理大量的文章、图片、视频等内容。
  5. 社交网络应用:MongoDB的灵活数据模型和高性能读写能力使其成为社交网络应用的理想选择,能够存储用户信息、社交关系、消息等数据。
  6. 物联网(IoT)应用:MongoDB可以存储和处理大规模的物联网设备生成的数据,如传感器数据、设备状态等,为物联网应用提供强大的数据支持。

6. SpringBoot 集成 MongoDB 🚀

源码地址:SpringBoot 集成 MongoDB

  1. 引入Maven依赖
    <!--父依赖,dependency可以不加依赖版本--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.2.4.RELEASE</version></parent><dependencies><!-- mongodb --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!-- spring-boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
  1. 添加yaml配置文件
server:port: 8082spring:data:mongodb:host: localhostdatabase: test_02port: 27017# 也可以直接使用uri连接
#      uri: mongodb://localhost:27017/test_02
  1. 创建实体类
@Data
@Document(collection = "comment")
public class CommentEntity {@Idprivate String id;// 点赞数@Field("likeNum")private Integer likeNum;// 内容private String comment;// 父Idprivate String parentId;
}
  1. 创建Dao
public interface CommentRepository extends MongoRepository<CommentEntity, String> {/*** 根据parentId获取数据* @param parentId* @return*/List<CommentEntity> findByParentId(String parentId);}
  1. 创建Test进行测试
@RunWith(SpringRunner.class)
// 如果不放在swp.basis.service目录下,必须指定BasisApplication启动类
@SpringBootTest(classes = BasisApplication.class)
public class CommentServiceTest {@Autowiredprivate CommentRepository commentRepository;@Testpublic void test(){System.out.println(commentRepository.findAll());System.out.println(commentRepository.findByParentId("66ed29b0bbf12138ee50b657"));}
}

相关文章:

MongoDB初学者入门教学:与MySQL的对比理解

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &…...

Oracle AI Vector Search

Oracle AI Vector Search 是 Oracle Database 23ai 中引入的一项新技术&#xff0c;它允许用户在数据库中直接存储和高效查询向量数据。这项技术旨在简化应用程序的开发&#xff0c;并且支持不同维度和格式的向量。以下是 Oracle AI Vector Search 的一些关键特性和优势&#x…...

基于SpringBoot的健身会员管理系统实战分享

在这个充满活力的时代&#xff0c;我们自豪地呈现一款专为健身爱好者和专业人士设计的会员管理系统——一个集创新、效率与便捷于一体的解决方案。我们的系统基于强大的RuoYi-Vue框架构建&#xff0c;采用最新的Spring Boot和Vue3技术&#xff0c;确保了系统的高性能和用户友好…...

Elasticsearch高级搜索技术-结构化数据搜索

目录 结构化数据的存储 示例映射 使用range查询 查询示例 运算符 更多示例 日期查询 示例 结构化数据搜索是Elasticsearch另一个强大的功能&#xff0c;允许用户对具有明确类型的数据&#xff08;如数字、日期和布尔值&#xff09;进行精确的过滤和查询。这种类型的搜索通常涉及…...

ffmpeg面向对象——类所属的方法探索

ffmpeg是面向对象的思想写的代码&#xff0c;自然符合oopc的实现套路。这个也是oopc的通用法则。 1.类所属方法oopc的实现形式 ffmpeg抽象出某一类&#xff0c;然后某一类的方法如何调用&#xff1f;你说这还不简单: 对象.对象方法&#xff08;&#xff09; 或者 对象指针-&g…...

TensorRT-LLM七日谈 Day3

今天主要是结合理论进一步熟悉TensorRT-LLM的内容 从下面的分享可以看出&#xff0c;TensorRT-LLM是在TensorRT的基础上进行了进一步封装&#xff0c;提供拼batch&#xff0c;量化等推理加速实现方式。 下面的图片更好的展示了TensorRT-LLM的流程&#xff0c;包含权重转换&…...

如何使用Pandas库处理大型数据集?

如何使用Pandas库处理大型数据集? 处理大型数据集是数据分析中的一个挑战,尤其是在资源有限的情况下。Pandas是Python中非常流行的数据处理库,但它在处理非常大的数据集时可能会遇到内存限制的问题。因此,我们需要一些策略来提高Pandas处理大型数据集的效率。以下是使用Pa…...

XHR 创建对象

XHR 创建对象 XMLHttpRequest(XHR)是现代Web开发中不可或缺的技术之一。它允许Web开发者通过JavaScript发送网络请求,以在不重新加载整个页面的情况下更新网页的某部分。XHR为开发者提供了一种在客户端和服务器之间传输数据的有效方式,是AJAX(Asynchronous JavaScript an…...

# 在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 分析

在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 分析 一、问题描述&#xff1a; 在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 如下图&#xff1a; 二、报错分析&…...

C++的类和动态内存分配(深拷贝与浅拷贝)并实现自己的string类

首先&#xff0c;我们先写一个并不完美的类&#xff1a; #include<iostream> #include<cstring> using namespace std;class Mystring{private:char *p;int len;static int num;friend ostream& operator<<(ostream& os, const Mystring& c);pu…...

通过观测云 DataKit Extension 接入 AWS Lambda 最佳实践

前言 AWS Lambda 是一项计算服务&#xff0c;使用时无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行代码并自动缩放。借助 AWS Lambda&#xff0c;几乎可以为任何类型的应用程序或后端服务运行代码&#xff0c;而且无需执行任何管理。 Lambda Layer 是一个包…...

MySQL-三范式 视图

文章目录 三范式三范式简介第一范式第二范式第三范式 表设计一对一一对多多对多最终的设计 视图 三范式 三范式简介 所谓三范式, 其实是表设计的三大原则, 目的都是为了节省空间, 但是三范式是必须要遵守的吗? 答案是否定的(但是第一范式必须遵守) 因为有时候严格遵守三范式…...

多线程(三):线程等待获取线程引用线程休眠线程状态

目录 1、等待一个线程&#xff1a;join 1.1 join() 1.2 join(long millis)——"超时时间" 1.3 join(long millis&#xff0c;int nanos) 2、获取当前线程的引用&#xff1a;currentThread 3、休眠当前进程&#xff1a;sleep 3.1 实际休眠时间 3.2 sleep的特殊…...

Hi3244 应用指导

Hi3244 是一款DIP8封装高性能、多模式工作的原边控制功率开关。Hi3244内高精度的恒流、恒压控制机制结合完备的保护功能&#xff0c;使其适用于小功率离线式电源应用中。在恒压输出模式中&#xff0c;Hi3244 采用多模式工作方式&#xff0c;即调幅控制&#xff08;AM&#xff0…...

【LeetCode热题100】哈希

1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答…...

Java的四种循环语句

背景&#xff1a; Java 中主要有四种循环语句&#xff1a;for 循环、while 循环、do-while 循环 和 foreach 循环&#xff08;也称为增强型 for 循环&#xff09;。下面我将分别介绍这四种循环语句&#xff0c;并给出相应的实例。 for循环&#xff1a; 1. for 循环for 循环是…...

Qt杂记目录

Qt 杂记目录 QMenu 1.menu转string Qt 窗口阴影边框...

项目开发--基于docker实现模型容器化服务

背景 1、docker-compose build 和 docker-compose up -d分别是什么作用&#xff1f; 2、如何进入新构建的容器当中 3、模型保存的方法区别 4、如何让docker容器启动的时候能使用cuda进行模型推理加速 5、如何实现容器的迭代 解决方案 问题1 docker-compose build 和 docker…...

C语言 | Leetcode C语言题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }...

Bug剖析

Bug剖析 • 所有的Bug报告有以下的基本要求&#xff1a; • 标题。要简略。 • 指派。谁来处理这个问题。 • 重现步骤。问题再次出现的相关步骤。 • 优先级别。问题的紧迫性与重要性。 • 严重程度。问题所产生的后果。 • 解决方案。怎么解决问题。 其他很多方面对修复问题…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...