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

news2024/12/23 0:08:25

🏝️ 博主介绍

大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~
👨‍🎓 个人介绍本人是一名后端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: 8082

spring:
  data:
    mongodb:
      host: localhost
      database: test_02
      port: 27017
      # 也可以直接使用uri连接
#      uri: mongodb://localhost:27017/test_02
  1. 创建实体类
@Data
@Document(collection = "comment")
public class CommentEntity {
    @Id
    private String id;

    // 点赞数
    @Field("likeNum")
    private Integer likeNum;

    // 内容
    private String comment;

    // 父Id
    private 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 {

    @Autowired
    private CommentRepository commentRepository;

    @Test
    public void test(){
        System.out.println(commentRepository.findAll());
        System.out.println(commentRepository.findByParentId("66ed29b0bbf12138ee50b657"));
    }
}

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

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

相关文章

JavaEE: HTTPS的魅力与优势揭秘

文章目录 HTTPSHTTPS 是什么HTTPS 基本工作过程Fiddle 等抓包工具,为啥能解析 HTTPS 的数据? HTTPS HTTPS 是什么 HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层. 几个核心概念: 明文: 要传输的原始数据.密文: 把明文进行加密之后得到一个让别人不能理解…

【算法篇】三道题理解什么是递归,回溯和剪枝

递归&#xff0c;回溯&#xff0c;剪枝 想必大家再学习算法知识的路上经常听到回溯&#xff0c;剪枝类似的概念&#xff0c;对于初学者来说&#xff0c;很容易把他们理解成一种新的算法思想&#xff0c;其实回溯和剪枝只是在递归的基础上稍加修改&#xff0c;对于解决某些特定问…

k8s的pod的管理

常用的Pod基础命令 列出所有命名空间中的所有Pod kubectl get pods --all-namespaces 列出指定命名空间中的所有Pod kubectl get pods -n <namespace> 显示指定Pod的详细信息&#xff0c;包括状态、事件等 kubectl describe pod <pod-name> -n <namespace>…

机器学习入门(一)

一、机器学习概述 1、人工智能 像人一样智能的综合与分析&#xff0c;机器模拟人类。 是一个系统&#xff0c;像人那样思考&#xff0c;像人那样理性思考。 是一个系统&#xff0c;像人那样活动&#xff0c;像人那样合理的系统 2、机器学习 让机器自动学习&#xff0c;而不…

SAP将假脱机(Spool requests)内容转换为PDF文档[RSTXPDFT4]

将假脱机(Spool requests)内容转换为PDF文档[RSTXPDFT4] 有时需要将Spool中的内容导出成PDF文件&#xff0c;sap提供了一个标准程序RSTXPDFT4可以实现此功能。 1, Tcode:SP01, 进入spool requests list 2, SE38 运行程序RSTXPDFT4 输入spool reqeust号码18680&#xff0c;然后…

excel 单元格嵌入图片

1.图片右键,设置图片格式 2.属性 随单元格改为位置和大小 这样的话&#xff0c;图片就会嵌入到单元格&#xff0c;也会跟着单元格的大小而改变

10-记录器

这个功能允许记录和重现以前的模拟。所有发生的事件都记录在记录器文件 recorder file中。 1 记录 所有数据仅在服务器端以二进制文件的形式写入。但是&#xff0c;记录器是使用 carla.Client管理的。 注意&#xff1a;在回放结束时&#xff0c;车辆将被设置为自动驾驶&#xf…

强化学习和QLearning及GAN到底是什么关系啊

强化学习&#xff08;Reinforcement Learning&#xff09;、Q-Learning 和生成对抗网络&#xff08;GANs&#xff09;是机器学习中的三个不同概念&#xff0c;它们虽然有一些交叉&#xff0c;但本质上是针对不同问题的技术方法。下面我来详细解释它们之间的关系和区别&#xff…

leetcode每日一题day22(24.10.2)——准时到达的列车最小时速

思路&#xff1a;这种在有约束条件情况下&#xff0c;求最值或最符合要求的情况&#xff0c;首先是很容易想到&#xff0c;从时速为1开始往后找找到满足条件就输出&#xff0c;但这无疑工程量很大&#xff0c;每种可能的速度都要对列车数组进行遍历&#xff0c; 时间复杂度为C…

链表Set_LinkList(并集)

并集是把两个集合合并&#xff0c;去除重复元素后组成的集合。 通过键盘输入将两个集合保存在链表A和链表B中&#xff0c;再创建一个链表C用于保存集合A、B的并集&#xff0c;将链表C打印输出。 提示&#xff1a; 1.相对于上一题&#xff08;链表Set_LinkList&#xff08;建立&…

java 微服务 端口冲突 redis虚拟磁盘满 nacos挂

java 微服务 端口冲突 哥 排除法呀 什么卸载软件QAQ netstat -ano | findstr :48080 输这个呀 然后 taskkill /PID 1234 /F redis虚拟磁盘满 导致 假死 挂了 nacos 挂了重启 nacosrun.bat startup -m standalone

facebook受众选择设置策略的最佳方式

在进行Facebookguanggao投放时&#xff0c;受众的选择是一个至关重要的步骤。正确的受众选择不仅能够帮助我们更好地定位目标用户&#xff0c;还能显著提高guanggao的转化率和投资回报率&#xff08;ROI&#xff09;。然而&#xff0c;受众选择的数量和范围同样是需要认真考虑的…

QtDesign预览的效果与程序运行的结果不一致的解决方法

存在的问题 使用Qt designer软件设计出来的界面&#xff0c;与转换成python程序运行出来的结果不一致&#xff0c;具体看下图 Qt designer预览结果 程序运行出来的结果 原因分析 我自己的电脑是2560*1600分辨率的屏幕&#xff0c;采用的是200%的缩放比例&#xff0c;出现这种…

虚拟机没有网络怎么解决

CentOS7为例 进入虚拟网络编辑器 1.更改设置 2.选中NAT模式点击3点击移除网络 4添加网络&#xff0c;随便选一个 5.点开NAT设置&#xff0c;记住网关 6.DHCP设置&#xff0c;注意虚拟机设置ip必须在起始ip和结束ip范围内 进入虚拟机网络适配器&#xff0c;自定义选中第4步操作…

Tailwind Css的使用

1.Tailwind Css是什么 官网解释&#xff1a;Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类&#xff08;class&#xff09;名&#xff0c;然后生成相应的样式代码并写入 到一个静态 CSS 文件中。 我的理解是利用Tailwind CSS 提供的…

Element-快速入门

什么是 Element 在现代前端开发中&#xff0c;组件化的思想日益盛行&#xff0c;Element组件库作为一款流行的UI组件库&#xff0c;特别适用于基于Vue.js的项目&#xff0c;它为开发者提供了丰富的组件和良好的开发体验。 想要使用Element的组件库&#xff0c;我们需要完成下面…

基于opencv的人脸闭眼识别疲劳监测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

基于函数计算FC 部署 ComfyUI实现AI生图 的优势

基于函数计算FC 部署 ComfyUI实现AI生图 的优势 部署ComfyUI实现AI生图使用函数计算FC 一键部署ComfyUI 绘画平台的优势有哪些&#xff1f; 在文章开始之前&#xff0c;先来看一下基于函数计算FC 部署 ComfyUI实现AI生图 的大概步骤&#xff0c;整个基础部署操作比较简单。即便…

《Programming from the Ground Up》阅读笔记:p181-p216

《Programming from the Ground Up》学习第10天&#xff0c;p181-p216总结&#xff0c;总计34页。 一、技术总结 第10章主要讲计算机是如何计算的&#xff0c;如十进制、二进制、八进制、十六进制以及浮点数和负数的表示。属于比较基础的内容&#xff0c;如果有一定基础&…

ai免费写论文是原创吗?分享5款ai写作免费一键生成助手

在当今的学术研究和写作领域&#xff0c;AI技术的应用越来越广泛&#xff0c;尤其是在论文写作方面。许多AI写作工具声称能够一键生成高质量的论文&#xff0c;并且保证原创性。然而&#xff0c;这些工具是否真的能生成完全原创的论文&#xff0c;仍然是一个值得探讨的问题。 …