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

一、数据库简介

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测试:
【MongoDB】MongoDB分布式文件存储的数据库_第1张图片
网页测试:
在这里插入图片描述

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("[email protected]");
        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("[email protected]");
        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("[email protected]");
        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 example = Example.of(user, matcher);
//        Page pages = userRepository.findAll(example, pageable);
//        System.out.println(pages);


//        Pageable pageable = PageRequest.of(0, 10); // 每页查询10条数据,查询第1页
//        List 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("[email protected]");
        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超详细保姆级入门教程!

【MongoDB】MongoDB分布式文件存储的数据库_第2张图片

你可能感兴趣的:(数据库,数据库,mongodb,分布式)