【MongoDB】MongoDB分布式文件存储的数据库

news2024/11/15 2:22:31

一、数据库简介

1、数据库

  • 数据库是按照数据结构来组织、存储和管理数据的仓库;
  • 我们的程序都是在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失;
  • 所以我们就需要将一些程序运行的数据持久化到硬盘中,以确保数据的安全性,而数据库就是数据持久化的最佳选择;
  • 数据库就是存储数据的仓库;

2、数据库分类

数据库主要分为两种:关系型数据库、非关系型数据库

(1)关系型数据库

  • MySQL、Oracle、DB2、SQL Server …
  • 关系数据库中全都是表

(2)非关系型数据库

  • MongoDB、Redis …
  • 键值对数据库
  • 文档数据库MongoDB

3、MongoDB简介

  • MongoDB是为了快速开发互联网web应用而设计的数据库系统;
  • MongoDB是设计目标是极简、灵活、作为web应用栈的一部分;
  • MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB的这个数据库中存的是各种各样的JSON(BSON:二进制JSON);

4、三个概念

  • 数据库:数据库是一个仓库,在仓库中可以存放集合;
  • 集合:集合类似于数组,在集合中可以存放文档;
  • 文档:文档数据库中的最小单位,我们存储和操作的内容都是文档;

5、MongoDB下载安装

环境变量添加: 你的MongoDB的bin目录的路径添加到path中即可。

cmd测试:
在这里插入图片描述
网页测试:
在这里插入图片描述

5、相关命令

  • mongod 用来启动服务器
  • mongo 用来启动客户端

二、数据库操作

1、userRepository 和 mongoTemplate

userRepository 和 mongoTemplate 都是 Spring Data MongoDB 提供的访问 MongoDB 数据库的方式,但是它们的使用方式和适用场合有所不同。

userRepository 是 Spring Data MongoDB 提供的一个高级抽象层,可用于在 MongoDB 中执行 CRUD 操作,每一个 userRepository 都相当于一个仓库。你可以定义一个接口继承自 MongoRepository<T,ID> 类,其中 T 代表实体类,ID 代表该实体类的 ID,Spring Data MongoDB 会自动生成对应的实现类。在自动生成的实现类中,你可以使用多种查询方式,如 findXXByXX 等,它们将返回一个或者多个匹配的实体类列表。userRepository 提供了一种更简洁的方式组织和使用查询,对于单表操作可以方便的完成常规操作。

mongoTemplate 是 MongoDB 原生 Java 驱动的封装。它提供了更为底层的访问方式,可通过它执行各种 MongoDB 原生命令,例如 update、remove 等。当在 MongoDB 操作需要使用类似的聚合操作或在使用 MongoDB 4.4 引入的一些高级特性的时候,则需要使用 mongoTemplate。与 userRepository 不同,mongoTemplate 对查询语句没有任何限制,处理起复杂操作更为方便。但是需要开发人员自己编写查询语句。

简单来说,如果你仅需要在 MongoDB 中执行常规的单表 CRUD 操作,则可以考虑使用userRepository,如果需要进行更复杂的操作,则可以使用 mongoTemplate。

2、mongoTemplated 的相关操作代码

import com.example.mongdb.entity.User;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

@SpringBootTest
class MongdbApplicationTests {

    @Autowired
    private MongoTemplate mongoTemplate;

    //添加
    @Test
    public void createUser() {
        User user = new User();
        user.setAge(10000);
        user.setName("李世民");
        user.setEmail("4932200@qq.com");
        User user1 = mongoTemplate.insert(user);
        System.out.println(user1);
    }

    //查询所有
    @Test
    public void findUser() {
        List<User> userList = mongoTemplate.findAll(User.class);
        System.out.println(userList);
    }

    //根据id查询
    @Test
    public void getById() {
        User user = mongoTemplate.findById("64560ce42c90521b42090b8d", User.class);
        System.out.println(user);
    }

    //条件查询
    @Test
    public void findUserList() {
        Query query = new Query(Criteria
                .where("name").is("test")
                .and("age").is(20));
        List<User> userList = mongoTemplate.find(query, User.class);
        System.out.println(userList);
    }

    //模糊查询
    @Test
    public void findUsersLikeName() {
        String name = "est";
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Query query = new Query(Criteria.where("name").regex(pattern));// regex 类似正则
        List<User> userList = mongoTemplate.find(query, User.class);
        System.out.println(userList);
        // ----------------------------------------------------------------------------------------
        // 使用 MongoDB 的 Java 驱动程序提供的 Criteria 和 PageRequest 类来实现
        Criteria criteria = new Criteria();
        criteria.and("name").regex("三");
        criteria.and("email").regex("22");
        // 使用PageRequest分页 并设置age降序排序
        PageRequest page = PageRequest.of(0, 10, Sort.by("age").descending());
        List<User> products = mongoTemplate.find(Query.query(criteria).with(page), User.class);
        System.out.println(products);
    }

    //分页查询
    @Test
    public void findUsersPage() {
        String name = "est";
        int pageNo = 1;
        int pageSize = 10;

        Query query = new Query();
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        query.addCriteria(Criteria.where("name").regex(pattern));
        int totalCount = (int) mongoTemplate.count(query, User.class);
        List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);

        Map<String, Object> pageMap = new HashMap<>();
        pageMap.put("list", userList);
        pageMap.put("totalCount",totalCount);
        System.out.println(pageMap);
    }

    //修改
    @Test
    public void updateUser() {
        // 根据id查询
        User user = mongoTemplate.findById("64560ce42c90521b42090b8d", User.class);
        // 设置修改值
        user.setName("杨贵妃");
        user.setAge(25);
        user.setEmail("493220990@qq.com");
        Query query = new Query(Criteria.where("_id").is(user.getId()));
        Update update = new Update();
        update.set("name", user.getName());
        update.set("age", user.getAge());
        update.set("email", user.getEmail());
        // 调用方法实现修改
        UpdateResult result = mongoTemplate.upsert(query, update, User.class);
        long count = result.getModifiedCount();
        System.out.println(count);
    }

    //删除操作
    @Test
    public void delete() {
        Query query =
                new Query(Criteria.where("_id").is("64560d1037499b2f6352a6b9"));
        DeleteResult result = mongoTemplate.remove(query, User.class);
        long count = result.getDeletedCount();
        System.out.println(count);
    }
}

3、userRepository 的相关操作代码

import com.example.mongdb.entity.User;
import com.example.mongdb.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;
import java.util.List;

@SpringBootTest
public class DemomogoApplicationTests1 {

    @Autowired
    private UserRepository userRepository;
    
    //添加
    @Test
    public void createUser() {
        User user = new User();
        user.setAge(22);
        user.setName("王三");
        user.setEmail("3332200@qq.com");
        User user1 = userRepository.save(user);
        System.out.println(user1);
    }

    //查询所有
    @Test
    public void findUser() {
        List<User> userList = userRepository.findAll();
        System.out.println(userList);
    }

    //id查询
    @Test
    public void getById() {
        User user = userRepository.findById("64561d604656851f9ff9235b").get();
        System.out.println(user);
    }

    //条件查询
    @Test
    public void findUserList() {
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        Example<User> userExample = Example.of(user);
        List<User> userList = userRepository.findAll(userExample);
        System.out.println(userList);
    }

    //模糊查询
    @Test
    public void findUsersLikeName() {
        //创建匹配器,即如何使用查询条件
        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
                .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
        User user = new User();
        user.setName("三");
        Example<User> userExample = Example.of(user, matcher);
        List<User> userList = userRepository.findAll(userExample);
        System.out.println(userList);
    }

    //分页查询
    @Test
    public void findUsersPage() {
//        Sort sort = Sort.by(Sort.Direction.DESC, "age");
//        //0为第一页
//        Pageable pageable = PageRequest.of(0, 5, sort);
//        //创建匹配器,即如何使用查询条件
//        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
//                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
//                .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
//        User user = new User();
//        user.setName("三");
//        //创建实例
//        Example<User> example = Example.of(user, matcher);
//        Page<User> pages = userRepository.findAll(example, pageable);
//        System.out.println(pages);


//        Pageable pageable = PageRequest.of(0, 10); // 每页查询10条数据,查询第1页
//        List<User> users = userRepository.findUsers(pageable);
//        System.out.println(users);

        String keyword = "三"; // 搜索关键字
        Pageable pageable = PageRequest.of(0, 2); // 每页查询10条数据,查询第1页
        List<User> users = userRepository.findUsersByRegex(keyword, pageable);
        System.out.println(users);

    }

    //修改
    @Test
    public void updateUser() {
        User user = userRepository.findById("64561d604656851f9ff9235b").get();
        user.setName("张三_1");
        user.setAge(25);
        user.setEmail("883220990@qq.com");
        User save = userRepository.save(user);
        System.out.println(save);
    }

    //删除
    @Test
    public void delete() {
        userRepository.deleteById("64561d604656851f9ff9235b");
    }
}

UserRepository 接口

import com.example.mongdb.entity.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface UserRepository extends MongoRepository<User,String> {
    // 分页查询
    @Query("{}")
    List<User> findUsers(Pageable pageable);

    // 模糊查询并分页
    @Query("{name: {$regex: ?0, $options: 'i'}}")
    List<User> findUsersByRegex(String keyword, Pageable pageable);
}

User 实体类

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@Document("User")
public class User {

    @Id
    private String id;
    private String name;
    private Integer age;
    private String email;
    private String createDate;
}

相关参考文档:MongoDB超详细保姆级入门教程!

在这里插入图片描述

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

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

相关文章

计算机信息安全保护等级划分为五个安全级别

《计算机信息安全保护等级划分准则》将计算机信息安全保护等级划分为五个安全级别&#xff1a; 安全级别级别名称是否需要备案对公民、法人和其他组织的合法权益造成的损害程度对社会秩序、公共利益造成的损害程度对国家安全造成的损害程度适用范围重要程度第一级自主保护级无…

智能感知编码优化与落地实践

作者 | XHF 导读 基于人眼视觉特性出发的感知编码优化技术&#xff0c;成为互联网短视频、OTT 等 UGC 场景的重点优化手段&#xff0c;可以在降低视频码率的同时&#xff0c;提升视频的观看体验。 今天主要有 4 个方面的内容。首先给大家介绍一下感知编码的技术背景&#xff1b…

论性价比,这家奥威BI大数据分析平台很能打

论性价比&#xff0c;国产BI大数据分析平台几乎是毫无悬念地胜过大多数外国BI&#xff0c;而在国产BI大数据分析平台里&#xff0c;奥威BI的性价比也是出了名地高。在同等价位的BI大数据分析平台中&#xff0c;奥威BI大数据分析平台不仅能提供智能高效的数据分析功能、花样繁多…

推动飞盘运动发展 冯氏集团承办中国飞盘联赛·上海站获圆满成功

5月14日下午&#xff0c;由冯氏集团主承办的2022-2023年中国飞盘联赛 上海站在上海市民体育公园足球公园圆满落幕&#xff0c;这是冯氏集团继去年创立飞盘俱乐部冠军赛&#xff08;Ultimate Clubs Championship Series&#xff0c;简称UCCS&#xff09;后&#xff0c;在飞盘及城…

springboot+jsp法律知识分享网站普法平台

法律知识分享平台&#xff0c;主要的模块包括查看主页、个人中心、用户管理、律师事务所管理、律师管理、法律资讯管理、案例分析管理、案例分享管理、法规信息管理、法规分享管理、留言信息管理、留言回复管理、论坛管理、系统管理等功能。系统中管理员主要是为了安全有效地存…

【教程】Warp/ZeroTrust 1.1.1.1 域名解析服务的安装与使用

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 目录 扫盲 安装 验证 说明 扫盲 1.1.1.1是一款免费的域名解析服务&#xff0c;也就是域名服务器&#xff0c;由CloudFlare与APNIC共同拥有与维护。该服务于2018年4月1日发表启用&#xff0c;且被Cloudflare称…

全局异常处理器

文章目录 一、全局异常处理器1.1 程序1.2 ControllerAdvice 注解 二、封装结果集 一、全局异常处理器 各层代码出现异常&#xff0c;我们是如何处理的&#xff1f; ​ 未做处理。 ​ 如果是在Mapper层出现异常&#xff0c;会抛给Service&#xff0c;Service会抛给Controller…

基于Java+SpringBoot制作一个论坛小程序

制作一个论坛互动平台,让兴趣志同道合者用户聚集在这里交流话题、展示自我、结交朋友。 一、小程序1.1 项目创建1.2 首页1.3 论坛板块页1.4 个人中心页1.5 帖子详情页二、API2.1 SpringBoot框架搭建

基于html+css的图展示74

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

进程线程基本知识

1 进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着 CPU 会执行程序中的每一条指令&#xff0c;那么这个运行中的程序&#xff0c;就被…

springboot+java网上求职人才招聘网站 s0rp8

本人才招聘网站采用Java技术&#xff0c;Mysql数据库开发&#xff0c;充分保证了系统稳定性、完整性。 人才招聘网站的设计与实现的设计思想如下&#xff1a; Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 …

期刊介绍|中科院一区8+期刊,影响因子飞涨,国人友好,明显扩刊趋势!

今天给大家介绍一本期刊&#xff1a;Hepatobiliary Surgery and Nutrition&#xff1b; 一、基本信息: 1、期刊名称&#xff1a;Hepatobiliary Surgery and Nutrition&#xff1b; 2、期刊ISSN&#xff1a;1054-139X&#xff1b; 3、出版商&#xff1a;Elsevier USA&#xff1b…

第四章 字符串

目录 一、反转字符串二、反转字符串 II三、替换空格四、反转字符串中的单词五、左旋转字符串六、找出字符串中第一个匹配项的下标&#xff08;KMP算法实现&#xff09;七、重复的子字符串 一、反转字符串 Leetcode 344 class Solution { public:void reverseString(vector<…

python连接kafka加载数据

背景&#xff1a;读取TXT文件&#xff0c;加载到kafka中&#xff0c;然后通过logstash消费kafka中的数据加载到es中 第一步&#xff1a;导入相应的依赖包 pip install kafka-python pip install loguru pip install msgpack第二步&#xff1a;编写连接kafka的代码 # -*- …

打印机出现错误0x00000709的原因及解决方法

一般来说&#xff0c;出现错误0x00000709&#xff0c;可能是用户试图设置默认打印机时&#xff0c;系统无法完成操作的错误。这种错误通常发生在Windows 10或Windows 7操作系统上。**驱动人生**分析&#xff0c;其原因可能是以下几种情况&#xff1a; 1、已经设置了另一个打印…

解决VMware虚拟机Centos7切换网络更换IP问题

解决VMware虚拟机Centos7切换网络更换IP问题 问题描述Centos7设置固定静态IP 问题描述 学习docker&#xff0c;在VMware虚拟机Centos7系统中使用docker部署了mysql&#xff0c;redis&#xff0c;nacos&#xff0c;虚拟机DHCP分配的ip为192.168.171.128&#xff0c;使用连接工具…

ThinkSystem DM 全闪存阵列 —— 通过全闪存 NVMe 转型加速您的业务

ThinkSystem DM 全闪存阵列——通过全闪存 NVMe 转型加速您的业务 挑战 要缩短产品上市时间并提高客户满意度&#xff0c;企业必须不断改善关键业务运营的速度和响应能力。其中的一个关键要素是全闪存存储&#xff0c;它可以大幅加速关键工作负载。 不过&#xff0c;随着全闪…

电风扇UL507认证指南!!!

UL 507 电风扇UL安全标准 L507标准适用于非工业用风机和鼓风机两大类。一是用于空气循环的风扇&#xff0c;如台扇和吊扇&#xff1b;二是用于通风的风扇&#xff0c;例如阁楼、墙壁、窗户和家用抽油烟机的风扇。此类别的风扇按照 NEC 安装。 测试类似于 UL 705&#xff0c;具…

GitLabCI/CD 构建数据采集与监控

点击上方蓝字⭐️关注“DevOps云学堂”&#xff0c;接收最新技术实践 今天是「DevOps云学堂」与你共同进步的第 25 天 如果这篇文章对您有帮助&#xff0c;欢迎转发点赞分享。您的关注是我持续分享的动力&#xff01; 使用Prometheus对GitLab Runner监控 1.1 配置GitLab Runner…

NGINX 和 HAProxy:基于公有云标准环境的用户体验测试对比

原文作者&#xff1a;Amir Rawdat of F5 原文链接&#xff1a;NGINX 和 HAProxy&#xff1a;基于公有云标准环境的用户体验测试对比 转载来源&#xff1a;NGINX 官方网站 业内许多性能基准测试&#xff0c;都是基于峰值吞吐量或每秒请求数 (RPS)&#xff0c;但这些指标可能会过…