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. 图论 代数系统:把一些形式上很不相同的代数系统,用统一的方法描述、研究、推理,从而得到反映出他们共性的一些结论,在将结论运用到具体的代数系统中 系统:运算研究对象 运算&…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
