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"));}
}

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

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

相关文章

020 elasticsearch7.10.2 elasticsearch-head kibana安装

文章目录 全文检索流程ElasticSearch介绍ElasticSearch应用场景elasticsearch安装允许远程访问设置vm.max_map_count 的值 elasticsearch-head允许跨域 kibana 商品数量超千万&#xff0c;数据库无法使用索引 如何使用全文检索&#xff1a; 使用lucene&#xff0c;在java中唯一…

MySQL 的数据类型

1.整数类型 1.1 tinyint tinyint 为小整数类型&#xff0c;存储空间为1个字节&#xff08;8位&#xff09;&#xff0c;有符号范围-128 ~ 127&#xff0c;无符号范围 0 ~ 255,此类型通常在数据库中表示类型的字段&#xff0c;如某一字段 type 表示学科,其中 “type1” 表示语文…

什么是芯片正向设计和芯片反向设计?

什么是芯片反向设计&#xff1f;反向设计其实就是芯片反向设计&#xff0c;它是通过对芯片内部电路的提取与分析、整理&#xff0c;实现对芯片技术原理、设计思路、工艺制造、结构机制等方面的深入洞悉&#xff0c;可用来验证设计框架或者分析信息流在技术上的问题&#xff0c;…

004、合并两个有序数组

0、题目描述 合并两个有序数组 1、法1 数组nums1有m个元素&#xff0c; 直接在下标为m的位置处追加nums2的元素。然后再qsort整体排序。 —— —— qsort函数&#xff0c;&#xff08;数组首元素地址&#xff0c;排序的个数&#xff0c;排序元素大小&#xff0c; 比较函数&…

从零实现高并发内存池

目录 1. 项目介绍1.1 这个项目具体功能是什么&#xff1f;1.2 本项目的知识储备 2. 什么是内存池2.1 池化技术2.2 内存池主要解决的问题2.3 malloc 3. 定长内存池设计4. 高并发内存池整体框架设计4.1 Thread Cache的设计思路4.2 Central Cache的设计思路4.3 Page Cache的设计思…

Vue工程化结构环境安装及搭建教程 : 之nvm

vue需要的环境&#xff1a; node.js : Node.js和Vue.js通常会一起使用。Node.js作为后端服务器&#xff0c;处理服务器端的逻辑和数据访问&#xff0c;而Vue.js则负责前端用户界面的构建和交互。通过Ajax通信&#xff0c;Vue.js应用程序向Node.js服务器发送请求&#xff0c;并…

模电板测试分析报告【运放直流偏置电路】

测试方法&#xff1a;输入一个1K正弦波,调节R80观看是否进行偏置调节。 需要接正负电源。 按照这个计算公式&#xff0c;信号在第二极被放大了11倍。 这么看的话第一级也被放大了10倍&#xff1a; R79是用来调节增益的&#xff0c;R80是用来调节偏置的&#xff1a; 芯片介绍&a…

大学生入学审核系统(论文+源码)_kaic

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大学生入学审核系统的开发全过程。通过分析大学生入学审核系统管理的不足&#xff0c;创建了一个计算机管理大学生入学审核系统的方案。文章介绍了大学生入学审核…

【C语言】你不知道的知识小盲区——柔性数组

文章目录 一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势 一、什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。在C99标准中&#xff0c;如果结构体的最后一个成员是…

Spring Integration + MQTT

1. 简介 Spring Integration&#xff1a; Spring Integration是一个开源的Java库&#xff0c;用于构建基于消息的应用程序。它提供了一套丰富的组件和工具&#xff0c;使得开发者可以轻松地开发出可靠、灵活和可扩展的集成解决方案。以下是Spring Integration的一些主要用途&…

jenkins 插件Publish Over SSH

一、安装插件 二、配置sshserver http://192.168.31.156:8080/manage/configure 三、添加自由风格&#xff1a;PublishOverSSHDemo 我们将工作目录&#xff1a;/var/lib/jenkins/workspace/PublishOverSSHDemo下的图片m3.jpeg 同步到目标143服务器目录&#xff1a;/root/imag…

SQL分类中的DDL

DDL&#xff08;Data Definition Language):数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;。 一、DDL语句操作数据库 1、查询所有数据库&#xff1a;show databases&#xff1b;&#xff08;一般用大写&#xff…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了多种人脸检测方法&#xff0c;以下是对OpenCV人脸检测的详细介绍&#xff1a; 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

【Docker系列】Docker查看镜像架构

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

模态与非模态的对话框

本文学习自&#xff1a; 《Qt Creato快速入门》 #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }1. #include "widget.h" #include "ui_w…

MySQL数据的导入

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

小白也能学会的预测新模型!ReliefF特征选择+XGBoost回归!

小白也能学会的预测新模型&#xff01;ReliefF特征选择XGBoost回归&#xff01; 目录 小白也能学会的预测新模型&#xff01;ReliefF特征选择XGBoost回归&#xff01;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现ReliefF-XGBoost多变量回归预测 1.excel数据…

有问必答!zabbix“专家坐诊”第259期问答

问题一 Q&#xff1a;现在监控项4万多&#xff0c;调整到多少比较合理 zabbix7.03&#xff1f; A&#xff1a;慢慢往上调&#xff0c;没有标准。 问题二 Q&#xff1a;想问下大家&#xff0c;zabbix的监控项怎么不能自动清除&#xff0c;比如说这次监控是A监控项&#xff0c;下…

如何通过构建对应的api服务器使Vue连接到数据库

一、安装数据库驱动 在后端安装 MySQL 数据库驱动&#xff0c;比如在 Node.js 环境中可以使用 mysql2 包来连接 MySQL 数据库。在项目目录下运行以下命令安装&#xff1a; npm install mysql2或者使用 yarn&#xff1a; yarn add mysql2二、创建数据库连接模块 创建一个专门…

Light灯光组件+组件的相关操作+游戏资源的加载

Light灯光组件 Type: Directional:平行光&#xff0c;模仿的是太阳光 Spot:聚光灯 Area:区域光 Color&#xff1a; 颜色值 Mode: RealTime:实时 Mix:混合 Baked:烘焙 Intersity: 光照强度 Indirect Multiplier:光照强度乘数 Shadow Type:影子设置&#xff1a;…