【MongoDB 】MongoDB 介绍及应用,设计到4个案例

news2024/9/25 10:31:18

 MongoDB 介绍概述

基础概念

MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比数据库mysql/MariaDB更好,同时也能为mysql/MariaDB分摊一部分的流量压力。

对于经常读写的数据他会存入内存,如此一来对于热数据的并发性能是相当高的,从而提升整体的系统效率。

另外呢,对于非事务的数据完全可以保存到MongoDB中,这些数据往往也是非核心数据。

一般来说,我们可以把一些非重要数据但是读写却很大的数据存储在MongoDB,比如我们自己的物流危化运输的车辆运行轨迹,GPS坐标,以及大气监测的一些动态指标等数据。又或者说咱们实战中的友情链接,友情链接在首页,这数据本身不重要,但是在首页里会经常被读到,并发读很大,所以放mongoDB中没毛病。

此外,mongodb提供的gridfs提供小文件存储,可以自己把控接口读取的权限,可以去限制,这一点也是有优势的,比如存储一些身份证信息啊,人脸信息啊都是可以的。


以下是MongoDB和数据库以及ElasticSearch(es没接触过的,待后续整合es后可以回过头来对比看看)的术语对比:

  • MongoDB可以创建多个数据库(同mysql)
  • 一个数据库可以创建多个collection(同mysql创建多表)
  • 一个集合可以包含很多文档数据(同mysql一张表包含很多行记录)

我们可以通过如下代码片段来更好的理解MongoDB的数据对比,假设这张表中总记录有3条:

UserList: [
    {
        userId: "1001",
        username: "lee",
        age: 18
    {
        userId: "1002",
        username: "jay",
        age: 20,
        sex: "boy"  
    },
    {
        userId: "1003",
        username: "jolin",
        age: 19,
        sex: "girl" 
    }
]

如上述代码中:

  • UserList是一个collection,在mysql中可以当做是一张表
  • UserList中的每个{}都是一个json对象,他们称之为document文档,在mysql中称之为行记录
  • userId、username、age、sex 这些都是field 域,在MySQL中称之为column列字段
  • field 域可有可无,这样是非常灵活的,例如第一个dicument文档,中sex域是没有的

 Docker 安装配置MongoDB

安装

docker pull mongo:6.0.3

运行 mongodb:

docker run --name mongo \
-p 28028:27017 \
--restart always \
-d mongo:6.0.3 \
--auth
  • -p 27017:27017 :端口映射
  • --auth :开启密码访问

至此安装成功~!

配置admin账号

docker exec -it mongo mongo admin

报错:

原因:MongoDB 的5.x以上的版本使用mongo来执行mongodb命令已经不支持了,需要改用mongosh来替代mongo

docker exec -it mongo mongosh admin

创建admin账号

db.createUser({ user:'admin',pwd:'imooc',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

测试成功

db.auth('admin', 'admin')

 MongoDB - HR职位信息举报

举报功能对于这个系统来讲,可有可无,举报量可能比较大,mysql数据库存储的瓶颈可能很快就会达到,解决数据库瓶颈会把一部分数据迁移到其他存储介质。

采用MongoDB原因
1.可有可无的数据
2.非常庞大的增加数据
MongoDB其他应用:日志的存储

整合MongoDB

pom父工程:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>3.12.11</version>
</dependency>

pojo中引入:

 整合springboot,使用springboot提供的

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

为什么放在pojo微服务里?

不仅仅在我们的web里使用MongoDB,还会使用MongoDB相应的对象,有映射关系,以及ElasticSearch也有对应映射类,使用映射类,就会使用MongoDB的依赖坐标

配置文件(web-业务微服务模块)

uri: mongodb://username:password@localhost:27017/database
你需要替换usernamepasswordlocalhostdatabase为你的MongoDB服务器的实际用户名、密码、地址和数据库名

其他服务排除依赖

因为pojo服务引入了MongoDB依赖,AB服务引入了pojo依赖,A服务使用MongoDB,B服务不使用,不使用的则要在自动装配里排除

启动类操作如下: 

代码实现

controller:举报信息的MO对象:

@Ids:生成相应主键 

service:

数据层调用:

使用Springboot内部集成的JPA,String,为id的类型

结果:

调用成功后新增了一张表 

MongoDB - 限制重复举报

 controller

service

impl

mapper

根据接口名字findByReportUserIdAndJobId实现条件过滤操作

验证时候要保证数据只有一条,因为返回的类型为对象

MongoDB - 查询举报记录

页面效果

vue-vue视图界面

vue-data()对象

vue-api

controller

因为MongoDB数据库存储时间是带有时间时分秒

BO

service

impl

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public PagedGridResult pagedReportRecordList(SearchReportJobBO reportJobBO,
                                                 Integer page,
                                                 Integer pageSize) {
        String jobName = reportJobBO.getJobName();
        String companyName = reportJobBO.getCompanyName();
        String reportUserName = reportJobBO.getReportUserName();
        Integer dealStatus = reportJobBO.getDealStatus();
        LocalDateTime beginDate = reportJobBO.getBeginDateTime();
        LocalDateTime endDate = reportJobBO.getEndDateTime();

        // 1. 创建查询对象
        Query query = new Query();

        // 2. 创建条件对象
        //Criteria criteria = new Criteria();

        // 3. 设置查询条件参数
        if (StringUtils.isNotBlank(jobName)) {
            query = addLikeByValue(query, "job_name", jobName);
        }
        if (StringUtils.isNotBlank(companyName)) {
            query = addLikeByValue(query, "company_name", companyName);
        }
        if (StringUtils.isNotBlank(reportUserName)) {
            query = addLikeByValue(query, "report_user_name", reportUserName);
        }

        if (dealStatus != null) {
            query.addCriteria(Criteria.where("deal_status").is(dealStatus));
        }

        if (beginDate != null && endDate == null) {
            query.addCriteria(Criteria.where("created_time").gte(beginDate));
        } else if (beginDate == null && endDate != null) {
            query.addCriteria(Criteria.where("created_time").lte(endDate));
        } else if (beginDate != null && endDate != null) {
            query.addCriteria(Criteria.where("created_time").gte(beginDate).lte(endDate));
        }

        // 4. 查询记录总数,必须在分页前查询,否则总数不对
        long counts = mongoTemplate.count(query, ReportMO.class);

        // 5. 设置分页,Direction:方向
        Pageable pageable = PageRequest.of(page,
                                            pageSize,
                                            Sort.Direction.DESC,
                                            "created_time");
        query.with(pageable);

        // 6. 执行查询
        List<ReportMO> list = mongoTemplate.find(query, ReportMO.class);

        // 7. 封装分页grid信息数据
        PagedGridResult gridResult = new PagedGridResult();
        gridResult.setRows(list);
        gridResult.setPage(page);
        gridResult.setRecords(counts);

        return gridResult;
    }

    private Query addLikeByValue(Query query, String key, String value) {
        // 拼接 正则表达式和查询参数
        Pattern pattern = Pattern.compile("^.*" + value + ".*$");
        // 指定要查询的属性
        query.addCriteria(Criteria.where(key).regex(pattern));
        return query;
    }

MongoDB是文档类型数据库,全部是json数据,当在Navicat里复制一条数据时,全部变成String和数字类型,之前字段为DateTime类型或其他类型会失效,修改类型进行测试 

MongoDB - 违规处理HR职位

        

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

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

相关文章

STL中的list以及简单实现

STL的list的底层结构其实就是带头双向循环双向链表 带头双向循环双向链表又简单又好用&#xff0c;效率又高&#xff0c;所以其结构是完美的&#xff08;对于链表而言&#xff09;&#xff1a; 其中一个原因&#xff1a;有哨兵位的头节点&#xff0c;又循环&#xff0c;找尾很…

前端day7-css选择器

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css</title><!-- 内嵌式CSS --><sty…

Python 为Excel单元格设置填充\背景色 (纯色、渐变、图案)

在使用Excel进行数据处理和分析时&#xff0c;对特定单元格进行背景颜色填充不仅能够提升工作表的视觉吸引力&#xff0c;还能帮助用户快速识别和区分不同类别的数据&#xff0c;增强数据的可读性和理解性。 本文将通过以下三个示例详细介绍如何使用Python在Excel中设置不同的单…

远程连接本地虚拟机失败问题汇总

前言 因为我的 Ubuntu 虚拟机是新装的&#xff0c;并且应该装的是比较纯净的版本&#xff08;纯净是指很多工具都尚未安装&#xff09;&#xff0c;然后在使用远程连接工具 XShell 连接时出现了很多问题&#xff0c;这些都是我之前没遇到过的&#xff08;因为之前主要使用云服…

javax.validation.constraints.NotEmpty 报错

1、问题 javax.validation.constraints.NotEmpty报错2、原因 validation-api版本较低问题 3、解决 升级版本 javax.validation:validation-api 由1.1.0.Final升级至 2.0.1.Final <dependency><groupId>javax.validation</groupId><artifactId>vali…

机房托管服务器说明

机房托管服务器是指将企业或个人的服务器放置到专业数据中心(IDC机房)进行管理和维护&#xff0c;由数据中心提供稳定、安全的运行环境以及网络连接等基础设施支持。rak小编为您整理发布机房托管服务器说明详细内容。 通过托管服务器到专业机房&#xff0c;企业能够享受到高性能…

【Redis 进阶】集群(重点理解流程和原理)

一、基本概念 前面学习的哨兵模式&#xff0c;提高了系统的可用性。但是真正用来存储数据的还是 master 和 slave 节点&#xff0c;所有的数据都需要存储在单个 master 和 slave 节点中。如果数据量很大&#xff0c;接近超出了 master / slave 所在机器的物理内存&#xff0c…

Maxon公司产品将于 2024 年 9 月提高订阅价格?

Maxon公司的用户们最近在Reddit和Core 4D论坛上分享了一张图片&#xff0c;图片内容显示了Maxon公司计划在2024年9月1日对其产品订阅价格进行调整&#xff0c;涉及的产品包括Cinema 4D和ZBrush等。 根据这张图片&#xff0c;Redshift渲染器的月度订阅费用将上涨2.2%&#xff0c…

社交网络的演变:从Facebook到Meta的战略转型

随着科技的飞速发展&#xff0c;社交网络平台正经历着深刻的变革。Facebook的品牌重塑为Meta不仅是名称的更改&#xff0c;更是对未来社交网络模式的全新定义。本文将深入探讨Facebook向Meta转型的背景、战略及其未来影响&#xff0c;剖析这一转型对社交网络的深远影响。 背景与…

UKP3d,AutoPDMS出报表时数值格式如何调整

用户问&#xff0c;支吊架一览表的位移数值不是整数&#xff0c;请问怎么处理呢&#xff1f; 1.在AutoPDMS是修改软件的安装目录下的配置文件&#xff0c;如图&#xff1a; 2.在UKP3d里修改报表元件&#xff0c;如图&#xff1a;

嵌入式day21

fileno 获得一个文件流指针中的文件描述符 FILE *fp -> int fd stream 文件流指针 返回值&#xff1a; 成功 返回文件描述符 失败 返回-1 关文件一般关封装度高的 fdopen 将文件描述符转化为文件流指针 int fd -> FILE *fp fd : 已经打开的文件描述符 mode &quo…

Unity检测鼠标进入、离开UI

Unity检测鼠标进入、离开UI检测 引用命名空间 UnityEngine.EventSystems IPointerEnterHandler&#xff1a;进入 IPointerExitHandler&#xff1a;离开 注意&#xff1a;Image需开启RaycastTarget using UnityEngine; using UnityEngine.EventSystems; public class IPointe…

8.7-主从数据库的配置+mysql的增删改查

一、mysql环境的配置 1.环境准备 &#xff08;1&#xff09;主数据库 #关闭防火墙 [rootmaster ~]# systemctl stop firewalld#关闭selinux [rootmaster ~]# setenforce 0#下载lrzsz工具 [rootmaster ~]# yum -y install lrzsz#安装rsync [rootmaster ~]# yum -y install rs…

如何高效利用阿里云Docker镜像仓库管理您的容器镜像

文章目录 前言一、Docker镜像仓库1.公共仓库2.私有仓库 二、开通阿里云Docker镜像仓库ACR1.创建阿里云账号并开通容器镜像服务2.创建命名空间与镜像仓库 三、如何使用镜像仓库ACR1.登录阿里云Docker Registry2.推送镜像到阿里云私有镜像仓库3.从阿里云私有镜像仓库拉取镜像 总结…

CAN直接网络管理(20240805)

长安CAN网络管理规范 个人理解&#xff1a;管理CAN网络中各NM节点的工作模式&#xff08;状态&#xff09;&#xff1b; 1.术语定义 &#x1f449;节点地址&#xff1a;用于唯一标识网络中每个节点的单字节数字&#xff0c;取值范围是 0x00~0xFF。&#x1f449;状态迁移&#x…

Vue3从零开始——掌握setup、ref和reactive函数的奥秘

文章目录 一、Vue 3 组合式 API 概述二、setup​ 函数的基本使用2.1 setup​ 函数的特点2.2 setup​ 函数的基本结构2.3 实现一个简单的小demo 三、ref​ 函数的功能和应用3.1 ref​函数介绍3.2 基本使用3.2.1 定义ref​数据3.2.2 修改响应式变量 3.3 使用ref​函数实现计数器 …

CTFHUB-web-RCE-过滤空格

开启题目 在 URL 后面拼接使用管道符执行注入&#xff0c;发现了 flag 的可疑文件 127.0.0.1|ls 因为这题过滤了空格&#xff0c;如果在 URL 中输入空格&#xff0c;则不会执行 ping 命令。那么这里将空格替换为 %09 &#xff0c;也就是 ASCII 的 Tab 键。右键检查网页源代码发…

【OpenCV-Python实战项目】01-OCR文本检测

OpenCVTesseract文本检测 0.介绍1.基础功能实现1.1 字符检测1.2 单词检测1.3 只检测数字 2.工程应用2.1 封装类2.2 屏幕截图识别2.3 视频文本检测&#xff08;待优化&#xff09; 3.参考 0.介绍 &#xff08;1&#xff09;Tesseract是一个开源文本识别 (OCR)引擎&#xff0c;是…

TypeScript数组

数组 数组 数据存储的集合 声明数组的两种方式 1.只声明不赋值 &#xff1a;let arr1:string[] <>泛型 数组在使用前先赋值 2.边声明边赋值 let arr3:string[][];//空数组 // [数据1,数据2,.....数据n]数据之间用,隔开 let arr4:string[][张三,李四,王五]; let ar…

A. Array

https://codeforces.com/gym/102875/problem/A p<30 可以建立30颗线段树维护 然后看操作 一.add 懒标记 二.mul 三.mi 好像不能找到 于是懒标记貌似不能做&#xff0c; 但是考虑结果都要mod p,所以数都在0-p之间 其实就是i-> (操作)%p的映射 那就不用维护别的标…