MongoDB介绍及使用教程
文章目录
- 一、MongoDB介绍
- 1. 什么是MongoDB
- 2. 为什么要用MongoDB
- 3. MongoDB的应用场景
- 4. MongoDB基本概念
- 二、MongoDB使用教程
- 1.下载安装(Windows)
- 2.MongoDB Conpass简单使用(选学)
- 3.使用navicat连接MongoDB
- 4.JAVA项目中使用MongoDB
- (1)开启用户名密码验证
- (2)整合SpringBoot项目
一、MongoDB介绍
1. 什么是MongoDB
MongoDB是一个文档数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB目前在数据库总排名第5,在NoSQL数据库排名首位,是当前最流行的数据库之一。
注意:这里所指文档并非我们一般理解的 PDF,WORD 文档,而是来自于“JSON Document”,以 JSON 为数据模型。官方介绍详见:MongoDB官网
2. 为什么要用MongoDB
(1)数据结构非常松散,数据格式是BSON(Binary JSON) ,其结构是面向对象的而不是二维表,因此可以存储比较复杂的数据类型。
①数据模型与对象模型接近,开发代码量低 ②这样的数据模型有利于提供高读写的能力,增强吞吐量。
③数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如能把“评论”直接怼到“文章“的文档中,而不必创建三张表来描述这样的关系
(2)支持对数据建立索引,及时查询能力强。原则上 Oracle 和MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。
(3)易伸缩,提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器
(4)自动故障转移,MongoDB自身提供了副本集,能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。
(5)数据恢复功能,MongoDB提供了Journaling日志的概念,类似mysql的bin-log日志,插入的时候先往日志里写入记录,再完成实际的数据操作,如果出现宕机可以读取Journaling日志进行修复。
(6)支持多种语言,包括RUBY,PYTHON,JAVA,C++,PHP等
3. MongoDB的应用场景
(1)MongoDB可以解决传统数据库不好解决的三高问题 High performance - 对数据库高并发读写的需求 Huge
Storage - 对海量数据的高效率存储和访问的需求 High Scalability && High Availability-
对数据库的高可扩展性和高可用性的需求 (2)MongoDB应用场景特点 数据量大; 读写操作频繁; 不需要复杂的事务和join操作;
数据价值较低,对事务要求不高 (3)常见实际应用场景 ①游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。 ②物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来。
③社交场景 使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。 ④物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。 ⑤视频直播 使用MongoDB存储用户信息、点赞互动信息。
⑥大数据应用 使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。
4. MongoDB基本概念
(1)与关系型数据库(RDBMS)类比:
MongoDB概念 | RDBMS概念 |
---|---|
数据库 | 数据库 |
集合 | 表 |
文档 | 行 |
字段 | 列 |
索引 | 索引 |
id | 主键 |
视图 | 视图 |
聚合操作 | 表连接 |
(2)基本概念介绍
数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名称的集合。
集合(collection):相当于SQL中的表,一个集合可以存放多个不同的文档。
文档(document):一个文档相当于数据表中的一行,由多个不同的字段组成。
字段(field):文档中的一个属性,等同于列(column)。 索引(index):独立的检索式数据结构,与SQL概念一致。
id:每个文档中都拥有一个唯一的id字段,相当于SQL中的主键(primary key)。
视图(view):可以看作一种虚拟的(非真实存在的)集合,与SQL中的视图类似。从MongoDB3.4版本开始提供了视图功能,其通过聚合管道技术实现。
聚合操作(lookup):MongoDB用于实现“类似”表连接(tablejoin)的聚合操作符。
二、MongoDB使用教程
1.下载安装(Windows)
进入下载地址,选择windows版本的进行下载即可。我这里下载的是6.0.4版本。
下载完成直接下一步下一步安装即可,最好不要修改安装位置,会默认装上可视化工具MongoDB Conpass。
控制台输入services.msc,查看MongoDB的服务,正常启动则安装成功。
2.MongoDB Conpass简单使用(选学)
(1)连接数据库
默认端口27017
(2)新建数据库Database和集合Collection
这里的集合相当于传统数据库的表名
(3)添加数据
我这里随便找了个json的数据,补充在_id后面,注意不要漏了逗号,否则会提示格式不对
(4)导出数据
可以导出json或者csv格式的数据,output那里需要指定一个文件进行导出
(5)添加索引
选择索引时会提示有哪些字段可以选
索引类型可以选择升序asc,降序desc,地理空间索引2dsphere,全文索引text
(6)其他功能
[Aggregation]选项卡即是聚合函数信息区,用于实现“类似”表连接操作;
[Schema]选项卡即是模式信息区,点击分析按钮可以看到当前集合(表)的执行信息,如表数据导入时间,表的具体字段、长度等信息;
[Explain Plan]选项卡即是执行计划信息区,可评估查询性能; [Validation]
选项卡可以用于验证数据,可以添加规则验证数据质量注:增删改查语法参照下面navicat
3.使用navicat连接MongoDB
(1)连接数据库
新建连接时选择数据库类型为MongoDB即可,默认端口27017
(2)增删改查
右键新建查询进入命令行页面
Ⅰ、新增
1)语法:
db. 集合名 .insert( 文档 ) : 往集合中插入一个文档
db. 集合名 .find(): 查询集合中所有文档
db.users.insertMany:批量插入
2)示例:
①插入一个用户对象
db.user.insert({name: "刘备",age:"24"
})
当没有设置id时,mangoDB会自动生成一个id。
往集合中新增文档,当集合不存在时会自动先创建集合,再往集合中添加文档。
②插入一个用户对象(设置id,设置数据类型)
db.user.insert({id: NumberLong(1), name: "赵日地", age: NumberInt(18)})
③批量插入
db.users.insertMany([{_id: 1,name: "sue",age: 19,type: 1,status: "P",favorites: { artist: "Picasso", food: "pizza" },finished: [ 17, 3 ],badges: [ "blue", "black" ],points: [{ points: 85, bonus: 20 },{ points: 85, bonus: 10 }]},{_id: 2,name: "bob",age: 42,type: 1,status: "A",favorites: { artist: "Miro", food: "meringue" },finished: [ 11, 25 ],badges: [ "green" ],points: [{ points: 85, bonus: 20 },{ points: 64, bonus: 12 }]},{_id: 3,name: "ahn",age: 22,type: 2,status: "A",favorites: { artist: "Cassatt", food: "cake" },finished: [ 6 ],badges: [ "blue", "red" ],points: [{ points: 81, bonus: 8 },{ points: 55, bonus: 20 }]},{_id: 4,name: "xi",age: 34,type: 2,status: "D",favorites: { artist: "Chagall", food: "chocolate" },finished: [ 5, 11 ],badges: [ "red", "black" ],points: [{ points: 53, bonus: 15 },{ points: 51, bonus: 15 }]},{_id: 5,name: "xyz",age: 23,type: 2,status: "D",favorites: { artist: "Noguchi", food: "nougat" },finished: [ 14, 6 ],badges: [ "orange" ],points: [{ points: 71, bonus: 20 }]},{_id: 6,name: "abc",age: 43,type: 1,status: "A",favorites: { food: "pizza", artist: "Picasso" },finished: [ 18, 12 ],badges: [ "black", "blue" ],points: [{ points: 78, bonus: 8 },{ points: 57, bonus: 7 }]}]
)
Ⅱ、删除
1)语法
删除 1 个,若有多个则删除第一个: db. 集合名 .deleteOne( … )
删除所有: db. 集合名 .deleteMany( … )
2)示例
①删除第一个 status=A的文档
db.users.deleteOne({ status: "A" })
②删除所有带有 name=abc 的文档
db.users.deleteMany({ name : "abc" })
③删除当前数据库中所有文档
db.users.deleteMany({})
Ⅲ、更新
1)语法:
更新1个:db.集合名.updateOne( … )
更新所有:db.集合名.updateMany( … )
2)示例:
①把一个带有 name=xyz 的文档,修改其 age 值为 30
db.users.updateOne({name: "xyz"}, {$set: {age: 30}})
②修改所有 name=xyz的文档,修改其name=“zyx” , age=20
db.users.updateMany({name: "xyz"} ,{$set: {name: "zyx", age: 20}})
Ⅳ、普通查询
1)语法
db. 集合名 .find(query , projection)
2)示例
①查询所有文档
db.users.find()
Ⅴ、高级查询
1)等值
语法 -> find({ 字段 : 值 })
2)比较查询
语法 -> find({ 字段 : { 比较操作符 : 值, …}})
如:db.users.find({age:{$gt:20}})
比较操作符:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
(!=) 不等 - $ne
集合运算 - KaTeX parse error: Expected '}', got 'EOF' at end of input: in 如:`{name: {in: [“xiaoyao”,“bunny”]}} 判断存在 - $exists 如:
{name: {$exists:true}}`
3)逻辑查询
语法 -> find({逻辑操作符: [条件1, 条件2, …]})
逻辑操作符:
(&&) 与 - $and
(||) 或 - $or
(!) 非 - $not
包含但不包含: $nor
存在: exists基于类型查询:exists 基于类型查询:exists基于类型查询:type
如:db.users.find({$and:[{age:{$gt:20}},{status:"A"}]})
4)模糊查询
MongoDB的模糊查询使用的是正则表达式的语法 如:{name: {$regex: /^.*keyword.*$/}}
4.JAVA项目中使用MongoDB
(1)开启用户名密码验证
Ⅰ.mongodb6.0后无默认shell工具(之前的版本是mongo.exe),需要下载,下载后将mongosh.exe、mongosh_crypt_v1.dll放入bin目录下 。下载地址
Ⅱ.打开mongosh.exe,按enter即可进入。
Ⅲ.执行下面命令
切换数据库:
use admin
创建用户,这里root是角色名
db.createUser({user: 'admin', // 用户名pwd: '123456', // 密码roles:[{role: 'root', // 角色db: 'admin' // 数据库}]
})
如果需要在admin数据库以外的数据库新建数据库test,可以给角色赋读写权限
db.grantRolesToUser("admin",[{ role: "readWrite", db: "test" }])
查看角色是否创建成功:
show users
下一次创建角色需要登录赋权
db.auth("admin","123456");
Ⅳ.修改配置文件
默认安装目录:C:\Program Files\MongoDB\Server\6.0\bin\mongod.cfg
找到#security: 处,添加
security: authorization: enabled
Ⅴ.重新启动,再试试不需要用户密码登录连接mongo,失败。再试试下面的连接是否成功。
Ⅵ.连接成功后可以在查看中显示隐藏的项目,否则admin的数据库是默认隐藏的。
(2)整合SpringBoot项目
添加maven包
<!--spring boot data mongodb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>3.0.2</version></dependency>
application.yml配置
spring:data:mongodb:uri: mongodb://admin:123456@localhost:27017/admin
新建User类
package com.example.user.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;import java.util.Date;@Data
@AllArgsConstructor
public class User {@Idprivate String userId;private String name;private Integer age;private Date createTime = new Date();}
UserRepository.java:
注意这里泛型的User对应的Collections(表),String代表主键类型。通过Web应用新增时会自动创建表。
package com.example.user.dal;import com.example.user.domain.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends MongoRepository<User, String> {}
UserController.java:
package com.example.user.controller;import com.example.user.dal.UserRepository;
import com.example.user.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
public class UserController {@RequestMapping(value = "/test")@ResponseBodypublic String test() {return "test111";}@Autowiredprivate final UserRepository userRepository;public UserController(UserRepository userRepository) {this.userRepository = userRepository;}@PostMapping("/addUser")@ResponseBodypublic String addNewUser(@RequestBody User user) {userRepository.save(user);return "添加成功!";}@GetMapping("/getUserList")@ResponseBodypublic String getUserList() {List<User> userList = userRepository.findAll();userList.forEach(user -> System.out.println(user.toString()));return "";}}
测试流程如下:
相关文章:

MongoDB介绍及使用教程
文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装(Windows)2.MongoDB Conpass简单使用(选学)3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…...

51单片机开发环境搭建 - VS Code 从编写到烧录
我安装并测试成功的环境: 操作系统:Windows 10 (22H2)单片机:STC89C52RCPython version: 3.7.6 在这之前,给51单片机写程序是用 Keil 5(编写编译)、STC-ISP(烧录),由于…...
python datetime、字符串和时间戳之间的相互转换12小时制和24小时制时间相互转化
文章目录1.字符串转datetime格式2.datetime转字符串3.时间戳转datetime格式4.datetime格式转时间戳5.应用:将12小时制的字符串转换为时间戳1.字符串转datetime格式 把字符串转换为datetime的格式 项目字符串的样子‘%m/%d/%Y %H:%M:%S’2/3/2023 15:30:20‘%m-%d-…...

百度百科词条怎么做?百度百科词条创建攻略分享
只要是想要将自己宣传出去的企业或是个人,都建议创建属于自己的百度百科词条,因为百度百科词条流量大、权重高、排名靠前,创建百度百科词条可以提高企业或是个人的知名度和口碑。 百度百科词条怎么做?每天都有用户在百度上搜索这…...

基于Hive的河北新冠确诊人数分析系统的设计与实现
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...

k8s二进制部署
目录 一、环境准备 常见的k8s部署方式 关闭防火墙 关闭selinux 关闭swap 根据规划设置主机名 在master添加hosts 将桥接的IPv4流量传递到iptables的链 时间同步 二、部署etcd集群 1、master节点部署 #查看证书的信息 上传etcd-cert.sh 和etcd.sh 到/opt/k8s/ 目录…...

Windows出现0xc00d36e5错误怎么办?
当我们使用Windows Media Player来播放视频文件时,可能会出现无法播放,并显示0xc00d36e5错误代码。该错误可能是因为Windows Media Player不支持视频格式、注册表项损坏、系统配置问题、第三方应用程序冲突等。下面将开始介绍0xc00d36e5错误的解决方法&a…...

Idea搭建Spring5.3.x源码阅读环境
1. 概述 Spring是一个轻量级Java开源框架,在Java项目开发过程中已经离不开Spring全家桶了,包括Spring、SpringBoot、SpringCloud等,学习好Spring基础源码也有助于更好在项目中使用Spring相关组件,在学习源码前需要搭建好源码学习…...

2.20jdbc
一.数据库编程的必备条件编程语言:java c c Python数据库 Oracle,MySQL,SQL Server数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包:MySQL提供了Java的驱动包mysqlconnector-java,需要就Java操作MySQL需要该驱动包二.Java的数据库编程JDBC,即…...

【代码随想录训练营】【Day19休息】【Day20】第六章|二叉树|654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树
最大二叉树 题目详细:LeetCode.654 这道题在题目几乎就说明了解题的思路了: 创建一个根节点,其值为 nums 中的最大值;递归地在最大值左边的子数组上构建左子树;递归地在最大值右边的子数组上构建右子树;…...

华为云计算之容灾技术
容灾是物理上的容错技术,不是逻辑上的容错同步远程复制:主备距离≤200km,只有在主备设备上都写成功,才会告诉主机写成功,不会丢失数据异步远程复制:主备距离>200km,只要主设备上写成…...

React系列之Redux
1 Redux概述 Redux 是 JavaScript 状态容器,提供可预测化的状态管理。Redux中文文档 Redux 和react没有必然关系,redux可以应用于各种框架,包括jquery,甚至js都可以使用redux,只不过redux和react更加搭配。redux也推…...

最简单得方法解决TCP分包粘包问题
如何用最简单的方法解决TCP传输中的分包粘包问题? 首先需要说明一点,分包粘包等等一系列的问题并不是协议本身存在的问题,而是程序员在写代码的时候,没有搞清楚数据的边界导致的。 看个简单的例子,TCP客户端不断的向服…...

免费使用通配符域名证书
文章目录前言一、手动安装acme.sh操作1、安装acme.sh2、使用dns api自动续签二、宝塔自动操作【推荐】总结前言 之前个人站点一般都是使用阿里云免费单域名证书,虽然好用但是只有一年有效,到期只能手动重新申请,并且每次弄个子域名出来就要重…...

0基础成功转行Python自动化测试工程师,年薪30W+,经验总结都在这(建议收藏)
两年前的决定我觉得还是非常正确的,就是自学了python,然后学习了自动化测试、性能测试、框架、持续集成,同时也把前面的软件测试基础知识全部补全了。目前的收入还比较满意,月入2W(仅代表个人收入),13薪&am…...

MyBaits
MyBaitsMyBaits的jar包介绍MyBaits的入门案例创建实体java日志处理框架常用的日志处理框架Log4j的日志级别Mybatis配置的完善Mybatis的日志管理使用别名alias方式一方式二SqlSession对象下的常用API查询操作Mapper动态代理Mapper 动态代理规范查询所有用户根据用户ID查询用户Ma…...

kubeadm的部署、Dashboard UI以及连接私有仓库
目录 一、kubeadm 部署 K8S 集群架构 1、环境准备 2、所有节点安装docker 3、所有节点安装kubeadm,kubelet和kubectl 3、部署K8S集群 二、dashboard 部署 1、 安装dashboard 2、使用火狐或者360浏览器访问 三 、安装Harbor私有仓库 四、 内核参数优化方案 …...
刷题记录:牛客NC20325[SDOI2009]HH的项链
传送门:牛客 题目描述: HH有一串由各种漂亮的贝壳组成的项链。 HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一 段贝壳,思考它们所表达的含义。 HH不断地收集新的贝壳,因此他的项链变得越来越长。 有一天&#…...
【REACT-路由v6】
REACT-路由v61. App.js2. 搭建路由2.1 普通写法2.2 使用useRoutes构建路由2.3 重定向封装2.4 嵌套路由中的组件Outlet3. 导航跳转3.2 声明式导航(NavLink标签)3.2 编程式导航跳转(useNavigate)3.2.1 获取参数3.2.1.1 useSearchPar…...

【离散数学】3. 代数系统
1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 代数系统:把一些形式上很不相同的代数系统,用统一的方法描述、研究、推理,从而得到反映出他们共性的一些结论,在将结论运用到具体的代数系统中 系统:运算研究对象 运算&…...

2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...

Python 解释器安装全攻略(适用于 Linux / Windows / macOS)
目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…...

SAP学习笔记 - 开发24 - 前端Fiori开发 Filtering(过滤器),Sorting and Grouping(排序和分组)
上一章讲了SAP Fiori开发的表达式绑定,自定义格式化等内容。 SAP学习笔记 - 开发23 - 前端Fiori开发 Expression Binding(表达式绑定),Custom Formatters(自定义格式化)-CSDN博客 本章继续讲SAP Fiori开发…...

Spring Cloud Alibaba Seata安装+微服务实战
目录 介绍核心功能三层核心架构安装微服务实战创建三个业务数据库编写库存和账户两个Feign接口订单微服务 seata-order-service9701库存微服务 seata-store-service9702账户微服务 seata-account-service9703测试结果 总结 介绍 Spring Cloud Alibaba Seata 是一款开源的分布式…...

【docker】Windows安装docker
环境及工具(点击下载) Docker Desktop Installer.exe (windows 环境下运行docker的一款产品) wsl_update_x64 (Linux 内核包) 前期准备 系统要求2: Windows 11:64 位系统&am…...

2025-06-02-IP 地址规划及案例分析
IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中,MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层,二者协…...

GPU虚拟化
引言 现有如下环境(注意相关配置:只有一个k8s节点,且该节点上只有一张GPU卡): // k8s版本 $ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7&…...

LabVIEW工业级多任务实时测控系统
采用LabVIEW构建了一套适用于工业自动化领域的多任务实时测控系统。系统采用分布式架构,集成高精度数据采集、实时控制、网络通信及远程监控等功能,通过硬件与软件的深度协同,实现对工业现场多类型信号的精准测控,展现 LabVIEW 在…...

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月8日第102弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀4-5个和值,可以做到100-300注左右。 (1)定…...
vue3 eslint ts 关闭多单词命名检查
无效做法 import { globalIgnores } from eslint/config import {defineConfigWithVueTs,vueTsConfigs, } from vue/eslint-config-typescript import pluginVue from eslint-plugin-vue import skipFormatting from vue/eslint-config-prettier/skip-formatting// To allow m…...