SpringBoot操作Mongo

news2024/12/30 1:07:24

文章目录

  • 引入依赖
  • yaml
  • 实体类
  • 集合操作
    • 创建删除
    • 相关注解
  • 文档操作
    • 添加实验 数据
    • 查询
    • 添加
    • 更新
    • 删除

引入依赖

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

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

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

yaml

# mongodb 没有开启任何安全协议
# mongodb(协议)://121.5.167.13(主机):27017(端口)/baizhi(库名)
spring.data.mongodb.uri=mongodb://192.168.111.101:27017/baizhi


# mongodb 存在密码
#spring.data.mongodb.host=tx.chenyn.cn
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=baizhi
#spring.data.mongodb.username=root
#spring.data.mongodb.password=root

实体类

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Date;

@ToString
@Setter
@Getter
@Document("users") // 这个 类实例代表 mongo中一条文档
public class UserDoc {
    @Id //将这个id 映射为文档中的 _id
    private int id;
    @Field("username")
    private String name;
    @Field
    private double salary;
    @Field
    private Date birthday;
}

集合操作

创建删除

  • 创建集合
@Test
public void testCreateCollection(){
    mongoTemplate.createCollection (UserDoc.class);//参数: 创建集合名称
}

注意: 创建集合 不能存在,存在报错

  • 删除集合
@Test
public void testDeleteCollection(){
    mongoTemplate.dropCollection(UserDoc.class);
}

相关注解

  • @Document
    • 修饰范围: 用在类上
    • 作用: 用来映射这个类的一个对象为 mongo 中一条文档数据
    • 属性:(value / collection )用来 指定操作的集合名称
  • @Id(只出现一次)
    • 修饰范围: 用在成员变量、方法上
    • 作用: 用来将成员变量的值映射为文档的_id 的值
  • @Field
    • 修饰范围: 用在成员变量、方法上
    • 作用: 用来 将成员变量以及 值映射为文档中 一个key、value对
    • 属性: ( name / value )用来指定在文档中 key 的名称,默认为成员变量名
  • @Transient
    • 修饰范围: 用在成员变量、方法上
    • 作用 : 用来 指定 该成员变量,不参与文档的序列化~

文档操作

添加实验 数据

for(let i=1;i<10;i++){
	db.users.insert({_id:i,username:"小丁"+i})
}

查询

在这里插入图片描述


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.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.List;

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void testCreateCollection() {
        // 查询所有
        mongoTemplate.findAll (UserDoc.class);

        // 根据 _id(id)查询
        mongoTemplate.findById (1, UserDoc.class);

        // 等值 查询
        Criteria criteria1 = new Criteria ();
        criteria1.andOperator (
                Criteria.where ("name").is ("小丁1")
        );
        mongoTemplate.find (Query.query (criteria1), UserDoc.class);

        // > gt  < lt  >= gte  <= lte
        Criteria criteria2 = new Criteria ();
        criteria2.andOperator (
                Criteria.where ("age").lt (25).gte (28)
        );
        mongoTemplate.find (Query.query (criteria2), UserDoc.class);

        //and
        Criteria criteria3 = new Criteria ().andOperator (
                Criteria.where ("name").is ("小丁1"),
                Criteria.where ("age").isNull ()
        );
        mongoTemplate.find (Query.query (criteria1), UserDoc.class);

        // or
        Criteria criteria4 = new Criteria ();
        criteria4.orOperator (
                Criteria.where ("name").is ("小丁"),
                Criteria.where ("age").isNull ()
        );
        mongoTemplate.find (Query.query (criteria4), UserDoc.class);

        // and or
        // name ="小丁" and( age=25 or age=28)
        Criteria criteria5 = new Criteria ().andOperator (
                Criteria.where ("name").is ("小丁"),
                new Criteria ().orOperator (
                        Criteria.where ("age").is (25),
                        Criteria.where ("age").is (28)
                )
        );
        mongoTemplate.find (Query.query (criteria5), UserDoc.class);

        // sort 排序
        // desc 降序  asc 升序
        // skip limit 分页
        Query query = new Query ();
        Query age = query.with (
                        // 按 name升序
                        // name相同 按age降序
                        Sort.by (
                                Sort.Order.asc ("name"),
                                Sort.Order.desc ("age")
                        )

                )
                .skip (5)
                .limit (3);

        mongoTemplate.find (age, UserDoc.class);

        //count 总条数
        mongoTemplate.count (new Query (), UserDoc.class);

        // distinct 去重
        // 参数 1: 查询条件
        // 参数 2: 去重字段
        // 参数 3: 操作集合
        // 参数 4: 字段类型
        List<String> nameList = mongoTemplate.findDistinct (
                new Query (),
                "name",
                UserDoc.class,
                String.class);


        //in
        mongoTemplate.find (
                Query.query (
                        Criteria.where ("a").in ("1", "2", "3", "4")
                ), UserDoc.class);

        //like
        List<UserDoc> userDocs = mongoTemplate.find (
                Query.query (
                        Criteria.where ("name").regex ("小")
                ), UserDoc.class);

        //使用 json 字符串方式查询
        Query query2 = new BasicQuery (
                "{$or:[{name:'编程人'},{name:'徐凤年'}]}",
                // 0 不显示
                // 1 显示
                "{name:0}");
        mongoTemplate.find (query2, UserDoc.class);
    }
}

添加

UserDoc user = new UserDoc ();

user.setId (10);
user.setName ("编程人_1");
user.setBirthday (new Date ());
UserDoc userDB = mongoTemplate.insert (user);//返回 保存的对象 insert or save
System.out.println (userDB);
  • insert: 插入重复数据时:insertDuplicateKeyException提示主键重复; save已存在的数据进行更新

  • insert 可以一次性 插入 多条数据

  • save: **不可以批量插入!**批处理操作时:insert可以一次性插入整个数据,效率较高;save需遍历整个数据,一次插入或更新,效率较低。

更新

@Test
public void testUpdate() {
    // 1.更新条件
    Query query = Query.query (Criteria.where ("age").is (23));
    // 2.更新内容
    Update update = new Update ();
    update.set ("name", "编程小d");

    // 单条更新
    mongoTemplate.updateFirst (query, update, UserDoc.class);
    // 多条更新
    mongoTemplate.updateMulti (query, update, UserDoc.class);
    // 更新插入
    mongoTemplate.upsert (query, update, UserDoc.class);

    // 返回值均为 updateResult
    // System.out.println("匹配条数:" + updateResult.getMatchedCount());
    // System.out.println("修改条数:" + updateResult.getModifiedCount());
    // System.out.println("插入id_:" + updateResult.getUpsertedId());
}

删除

@Test
public void testDelete() {
    // 删除所有
    mongoTemplate.remove (new Query (), UserDoc.class);
    // 条件删除
    mongoTemplate.remove (
            Query.query (Criteria.where ("name").is ("编程小d")),
            UserDoc.class
    );
}

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

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

相关文章

Jmeter配置不同业务请求比例,应对综合场景压测

背景 在进行综合场景压测时&#xff0c;遇到了如何实现不同的请求所占比例不同的问题。 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置。 这种方法不是很好&#xff0c;因为服务器对不同的请求处理能力不同&#xff0c;有的处理快…

C规范编辑笔记(八)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) 正文&#xff1a; 今天来给大家分享我们的第八篇C规范编辑笔记&#xff0c;话不多说&#xff0c;我们直接来看&…

计算机毕设Python+Vue新闻类网站(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于微信小程序的灯具商城系统-计算机毕业设计

项目介绍 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

Java中IO体系

File File类 File类 : 表示计算机中所有的文件和文件夹; [计算机硬盘上除了文件就是文件夹]如何创建File对象 :File(String pathname) : 传入文件路径[String],创建File对象并指向这个路径的文件/文件夹File(String parent, String child) :传入文件路径[String],创建File对象…

【机器学习---02】机器学习相关名词解释

文章目录1. 损失函数、期望风险、经验风险2. 经验风险最小化和结构风险最小化2.1 结构风险&#xff08;正则化&#xff09;2.2 两者的定义3. 训练误差 与 测试误差4. 过拟合 与 欠拟合4.1 过拟合及解决方法4.2 交叉验证4.3 欠拟合5. 泛化误差 与 泛化误差上界5.1 泛化误差5.2 泛…

Filter Listener Ajax学习笔记

1 Filter Filter用于请求的过滤&#xff0c;如请求时&#xff0c;做登录的全局性校验 1.1 示例 在创建Filter前&#xff0c;可以通过启动Tomcat访问index.jsp http://localhost:8080/Mvc-Demo/index.jsp添加Filter后&#xff0c;重新启动Tomcat&#xff0c;并再次访问index…

8、java常见名词总结

一、JMM 1.1、JMM简介 JMM 是Java内存模型&#xff08; Java Memory Model&#xff09;&#xff0c;简称JMM。它本身只是一个抽象的概念&#xff0c;并不真实存在&#xff0c;它描述的是一种规则或规范&#xff0c;是和多线程相关的一组规范。通过这组规范&#xff0c;定义了…

babel-plugin-transform-remove-console 项目打包去除console

安装babel-plugin-transform-remove-console 项目打包去除console npm install babel-plugin-transform-remove-console --save-dev 在vue项目中babel.config.js中&#xff1a; module.exports {plugins: ["transform-remove-console",], }; 如果只想在生产环境…

Java+SSM影院订票系统|电影院购票系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术实现如下 后台框架&#xff1a;Spring、SpringMVC、MyBatis UI界面&#xff1a;BootStrap、jQuery 、JSP 数据库&#xff1a;MySQL 系统分为前台订票和后台管理&#xff1a; 1.前台订票 用户注册、用户登录、查看电影列表、分类查看 电影搜索、查…

C语言基础篇 —— 5.0 详解C语言变量的四大属性

文章目录概述C语言变量四大属性存储类概念解析Linux 内存映像并解析作用域概念解析局部变量的代码块作用域函数名和全局变量的文件作用域同名变量的掩蔽规则生命周期概念解析栈变量的生命周期堆变量的生命周期数据段、bss段变量的生命周期代码段、只读段的生命周期链接属性概念…

Linux——虚拟机安装Linux系统

实验1-2 虚拟机安装Linux系统 VMware 9.0 虚拟机Linux镜像ISO文件相关工具可以在这里边找到 http://pan.baidu.com/s/1ntA18FJ 或者请自行下载使用 创建新的虚拟机&#xff0c;如下图&#xff1a; 下一步&#xff1a;选择安装配置类型为“典型”如下图&#xff1a; 下一步&…

k8s之Ingress

Ingress和Ingress控制器介绍 Ingress官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/ Ingress控制器官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/ 在k8s中将一个…

Multipartfile判断文件类型的简单处理办法。

通过浏览器上传的文件在后台需要验证文件类型。如果单纯匹配后缀名的方式是有风险的&#xff0c;容易被换了后缀的病毒文件给破坏掉。 比如&#xff1a; 如果我上传已修改的文件。&#xff08;把xlsx改成了jpg&#xff09; 这样&#xff0c;无法识别出来真实的内容。 所以为了…

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(六:Hystrix之熔断、降级、限流)~整起

Hystrix 中文文档&#xff1a;https://www.apiref.com/spring-cloud-zh/dalston/#_circuit_breaker_hystrix_clients服务雪崩&#xff1a;服务 A 调用了服务 B&#xff0c;服务 B 再调用了服务 C&#xff0c;但是因为某些原因&#xff0c;服务 C 顶不住了&#xff0c;这个时候大…

Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Strimzi Kafka Bridge(桥接)实战》的第三篇&#xff0c;前文咱们掌握了Strimzi Kafka Bridge的基本功能&#xff1a;基于http提供各种kafk…

特海国际通过港交所上市聆讯:翻台率下滑明显,张勇夫妇为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;海底捞&#xff08;HK:06862&#xff09;海外业务分拆公司特海国际控股有限公司&#xff08;下称“特海国际”&#xff09;通过港交所上市聆讯。据贝多财经了解&#xff0c;特海国际将以介绍形式于港交所主板上市。所谓介绍形式&…

数据挖掘Java——Apriori算法的实现

一、Apriori算法的前置知识 Apriori算法是一种挖掘关联规则的频繁项集算法&#xff0c;其核心思想是通过候选集生成和向下封闭检测两个阶段来挖掘频繁项集。 关联规则挖掘是数据挖掘中最活跃的研究方法之一&#xff0c;最初的动机是针对购物篮分析问题提出的&#xff0c;其目…

[附源码]Node.js计算机毕业设计工会会员管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【Linux学习】多线程

目录前言一、初识线程1. 线程的概念2. 线程的优缺点3. 线程异常4. 线程的用途二、Linux中的线程和进程1. 进程和线程的区别2. 进程中的线程共享三、Linux线程控制1. POSIX线程库2. 创建线程3. 线程终止4. 线程等待5. 线程分离四、Linux线程互斥1. 线程互斥的概念2. 互斥量mutex…