MongoDB的搭建 和crud操作

2023-09-15 21:20:51

MongoDB

docker 下载

docker run --restart=always -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6

使用navcat工具使用MongoDB
在这里插入图片描述

Crud操作

jar包

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
// 作用时与 MongoDB中的206_person对应
@Document("206_person")
public class Person {
    @Id
    private Integer id;
    private String  name;
    private Integer girls;
}

导入的包,如果出现错误进行参考

import com.hb.model.Person;
import com.mongodb.client.ListIndexesIterable;
import com.mongodb.client.model.Indexes;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.bson.Document;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.Index;
import org.springframework.data.mongodb.core.index.IndexInfo;
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 javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
class AppTests {
    @Resource
    private MongoTemplate mongoTemplate;
   
   }

官方文档
示例均以spring boot 测试类

创建(增)

 //插入
    @Test
    //插入一条数据
    void mongoDBInsert() {
        Person shuai1 = Person.builder().id(1).name("小帅").girls(10086).build();
        mongoTemplate.insert(shuai1);
    }
    @Test
    //插入多条数据
    void mongoDBInsertAll() {
        List<Person> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Person shuai1 = Person.builder().id(i).name("小帅"+ i).girls(10086).build();
            list.add(shuai1);
        }
        mongoTemplate.insertAll(list);
    }

修改(改)

 //更新
    @Test
    //有数据更新数据 没有数据创建数据
    void mongoDBSave() {

            Person shuai1 = Person.builder().id(1).name("小帅shuai ").girls(1008611).build();
        mongoTemplate.save(shuai1);
    }
    @Test
    //根据 条件 进行对多条数据进行更新
    void mongoDBUpdate() {
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("小帅"));
        Update update = new Update();
        Update id = update.set("name", "ggg");
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Person.class);
        System.out.println(updateResult);

    }
    @Test
    //根据 条件 进行数据的更新
    void mongoDBUpset() {
        Query query = new Query();
        //更新的条件
        query.addCriteria(Criteria.where("id").is(3));
        //更新的内容
        Update update = new Update();
        Update id = update.set("name", "ggg");
        //更新找到的第一个数据
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Person.class);
        System.out.println(updateResult);
    }
    @Test
    //根据 正则表达式 and 连接 条件 进行数据的更新
    void mongoDBUpsetMany() {
        Query query = new Query();
        Query query1 = query.addCriteria(Criteria.where("id").gt(4)
                .and("name").regex(".*gg$"));
        Update update = new Update().set("name","嘎嘎");
        //更新找到的第一个数据
        UpdateResult updateResult = mongoTemplate.updateMulti(query,update,Person.class);
        System.out.println(updateResult);
    }

删除(删)

  //删
    @Test
    //根据 正则表达式 and 连接 条件 进行数据的删除 不返回数据
    void mongoDBDelete() {
        Query query = new Query();
        Query query1 = query.addCriteria(Criteria.where("id").gt(4)
                .and("name").regex(".*嘎嘎$"));
        //更新找到的第一个数据
        DeleteResult remove = mongoTemplate.remove(query, Person.class);
        System.out.println(remove);
    }
    @Test
    //根据 正则表达式 and 连接 条件 进行数据的删除 返回数据
    void mongoDBDeleteReturnOne() {
        Query query = new Query();
        Query query1 = query.addCriteria(Criteria.where("id").lt(4)
                .and("name").regex(".*gg$"));
        //更新找到的第一个数据
        Person andRemove = mongoTemplate.findAndRemove(query, Person.class);
        System.out.println(andRemove);
    }
    @Test
    //根据 正则表达式 and 连接 条件 进行数据的删除 返回数据
    void mongoDBDeleteReturnAny() {
        Query query = new Query();
        Query query1 = query.addCriteria(Criteria.where("id").lt(4)
                .and("name").regex(".*gg$"));
        //更新找到的第一个数据
        List<Person> allAndRemove = mongoTemplate.findAllAndRemove(query, Person.class);
        System.out.println(allAndRemove);
   
    }

读取(查)

 //查
    @Test
        //找到全部
    void mongoDBFindAll() {
        List<Person> allAndRemove = mongoTemplate.findAll(Person.class);
        System.out.println(allAndRemove);
    }
    @Test
    //找到符合条件的第一个数据
    void mongoDBFindOne() {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").in(1,2,3,4,5,6,7));
        //根据条件找到的第一个数据
        Person person= mongoTemplate.findOne(query,Person.class);
        System.out.println(person);
    }
    @Test
    //找到符合条件的第一个数据
    void mongoDBFindAny() {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").in(1,2,3,4,5,6,7));
        //根据条件找到的第一个数据
        List<Person> people = mongoTemplate.find(query, Person.class);
        System.out.println(people
        );
    }
    @Test
    //找到id
    void mongoDBFindById() {
        //根据条件找到的第一个数据
        Person people = mongoTemplate.findById(3, Person.class);
        System.out.println(people);
    }
    @Test
    //找到 根据or和正则进行查找所有
    void mongoDBFindByOr() {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").gte(4)
                .orOperator(Criteria.where("name").regex("^小帅.*")));
        //根据条件找到的第一个数据
        List<Person> people = mongoTemplate.find(query, Person.class);
        System.out.println(people);
    }
    @Test
    //  find by sort
    // Sort.Direction.DESC 降序排列  默认为升序
    // 这里需要记得order by 在limit和skip之前
    void mongoDBFindBySort() {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").gte(4)
                .orOperator(Criteria.where("name").regex("^小帅.*")));
        query.with(Sort.by(Sort.Direction.DESC,"name")).limit(2).skip(3);
        //根据条件找到的第一个数据
        List<Person> people = mongoTemplate.find(query, Person.class);
        System.out.println(people);
    }
    @Test
    //  find by count
    void mongoDBCount() {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").gte(4)
                .orOperator(Criteria.where("name").regex("^小帅.*")));
        query.with(Sort.by(Sort.Direction.DESC,"name")).skip(3);
        //根据条件找到的第一个数据
        Long people = mongoTemplate.count(query, Person.class);
        System.out.println(people);
    }

创建索引

    //索引操作

    @Test
    public void createAscendingIndex() {
        // 设置字段名称
        String field = "age";
        // 通过表名字创建索引
        mongoTemplate.getCollection("person").createIndex(Indexes.descending(field));
        //获取索引位置 Person.class 对应的 ”206_Person“
        int i = mongoTemplate.getCollectionName(Person.class).indexOf("age");
        System.out.println(i);

        //设置 Person对应的 206_persion 中的索引
        String s = mongoTemplate.indexOps(Person.class).ensureIndex(new Index().on("id", Sort.Direction.ASC));
        System.out.println(s);
    }

    /**
     * 根据索引名称移除索引
     */
    @Test
    public void removeIndex() {
        // 设置字段名称
        String field = "age_-1";
        // 删除索引
        mongoTemplate.getCollection("person").dropIndex(field);
       // mongoTemplate.indexOps(Person.class).dropIndex(field);
    }

    /**
     * 查询集合中所有的索引
     */
    @Test
    public void getIndexAll() {
        // 获取集合中所有列表 by 表名字
        ListIndexesIterable<Document> indexes = mongoTemplate.getCollection("person").listIndexes();
        // 获取索引
        for (Document index : indexes) {
            System.out.println(index.toJson());
            System.out.println("-----------------------------");
        }
        // 获取集合中所有列表 by 类
        List<IndexInfo> indexInfo = mongoTemplate.indexOps(Person.class).getIndexInfo();
        for (IndexInfo info : indexInfo) {
            System.out.println("206 " + info);
        }
    }
更多推荐

vue+axios+el-progress(elementUI组件)实现下载进度条实时监听(小白简洁版)

一、实现效果二、实现方式方案:使用axios方法onDownloadProgress方法监听下载进度使用此方式的前提!!!请让后端在响应头中加上content-length,存放下载文件的总大小,如下图:三、代码1、进度条页面代码如下:<Spinfixv-if="spinVisible"><Icontype="ios-

天翎知识管理系统:强大的权限管理功能,保障知识安全

编者按:知识管理系统的权限管理功能,可以帮助企业实现对知识库的精细化管理,保证知识库的安全性和稳定性。本文将介绍天翎知识管理系统的权限管理体系,通过权限管理,控制用户的编辑和审核权限,从而保证知识内容的准确性和质量。知识管理系统权限管理的重要性保护知识安全:通过权限管理,可以控制哪些用户可以访问、修改甚至删除特定的知识

汽车电子AEC Q101车规认证FDD9507L-F085 P沟道MOS管

深力科带你了解关于汽车电子AECQ101车规认证?是一种针对分立半导体的可靠性测试认证程序,由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性、温度循环和湿度变化等方面的测试要求。AECQ101是汽车电子领域的一个产品认证标准,它

第一次课(反馈,未讲评)

目标服务和目标进程是两个概念,在计算机领域中有着不同的含义和用法。目标服务(TargetService)指的是在分布式系统或网络中提供特定功能或服务的软件组件或模块。它通常以独立的方式运行,通过接收请求并提供相应的功能来满足服务需求。例如,Web服务器、数据库服务器、文件服务器等都可以被视为目标服务。目标进程(Targ

代码随想录训练营 DP

代码随想录训练营DP583.两个字符串的删除操作🌸代码72.编辑距离🌸代码今天整理的东西都放在注释里了583.两个字符串的删除操作🌸给定两个单词word1和word2,返回使得word1和word2相同所需的最小步数。每步可以删除任意一个字符串中的一个字符。代码funcminDistance(w1string,w

【Linux】【网络】协议:(序列化和反序列化)json 的安装和简单使用

文章目录1.下载json2.基本使用value类型:万能类型Writer类型:序列化Reader类型:反序列化3.使用举例1.下载jsonyummakecachefastyum-yinstalljsoncpp-devel2.基本使用头文件:#include<jsoncpp/json/json.h>编译时需要加上-ljs

Qt中音频的使用

对于音频我们在使用的过程中一般是录制音频、播放音频。针对这两个需求介绍Qt中音频的使用。Qt中音频的录制步骤:1、获取系统中的音频设备。2、创建QAudioRecorder对象,指定使用的音频设备,通过QAudioRecorder的setAudioInput函数设置。3、设置音频的保存位置,通过QAudioRecord

【李沐深度学习笔记】按特定轴求和

课程地址和说明线性代数实现p4本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。这节就算之前内容的复习,后面以截图形式呈现这节课就简单说明以下,axis为0是行,1是列,为0是每一列按行往下加和,为1就是每一行按列往下加和(SUM)按某个维度求和就把某个维度去掉后求和如果保留维

Android tinker升级之路分析

前言目前app线上的tinker版本为1.9.14.19,在最近的几个版本技术需求中,我们希望对tinker尝试进行升级,并对内部封装的tinker的包装sdk进行升级。升级过程中的一些热修流程和记录如下。热修耗时时长分析测试中,所有测试热修基本均可生效,但是对补丁合成生效时间有要求。耗时具体体现在:tinker初始化

二分类问题的解决利器:逻辑回归算法详解(一)

文章目录🍋引言🍋逻辑回归的原理🍋逻辑回归的应用场景🍋逻辑回归的实现🍋引言逻辑回归是机器学习领域中一种重要的分类算法,它常用于解决二分类问题。无论是垃圾邮件过滤、疾病诊断还是客户流失预测,逻辑回归都是一个强大的工具。本文将深入探讨逻辑回归的原理、应用场景以及如何在Python中实现它。🍋逻辑回归的原理逻辑回归

Rust解决Bug错误“error: future cannot be sent between threads safely”

介绍:在开发过程中,我们可能会遇到错误消息:“error:futurecannotbesentbetweenthreadssafely”。这个错误通常是由于使用了不可发送(notSend)的类型引起的,尤其是std::sync::MutexGuard类型。这意味着我们不能将一个互斥锁(mutex)在不同线程间进行传递,

热文推荐