Spring Boot中快速操作Mongodb

news/2024/2/24 7:11:23/文章来源:https://blog.csdn.net/weixin_42907150/article/details/135635964

Spring Boot中快速操作Mongodb

在Spring Boot中集成Mongodb非常简单,只需要加入Mongodb的Starter包即可,代码如下:

复制代码<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

然后配置Mongodb的连接信息:

复制代码spring.data.mongodb.uri=mongodb://192.168.0.13/test

完整配置信息请参考下面:

复制代码spring.data.mongodb.authentication-database= # Authentication database name.
spring.data.mongodb.database= # Database name.
spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use.
spring.data.mongodb.grid-fs-database= # GridFS database name.
spring.data.mongodb.host= # Mongo server host. Cannot be set with URI.
spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI.
spring.data.mongodb.port= # Mongo server port. Cannot be set with URI.
spring.data.mongodb.repositories.type=auto # Type of Mongo repositories to enable.
spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials.
spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI.

配置好了之后就直接可以注入MongoTemplate操作数据了

添加数据

首先创建一个实体类,我们这边用文章来做实体类,定义如下字段:

复制代码import java.util.Date;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
/*** 文章信息* @author yinjihuan**/
@Document(collection = "article_info")
public class Article {@Idprivate String id;@Field("title")private String title;@Field("url")private String url;@Field("author")private String author;@Field("tags")private List<String> tags;@Field("visit_count")private Long visitCount;@Field("add_time")private Date addTime;//省略get set方法
}

实体类中的注解解释如下: 1.Document注解标识这是一个文档,等同mysql中的表,collection值表示mongodb中集合的名称,不写默认为实体类名article。 2.Id注解为主键标识 3.Field注解为字段标识,指定值为字段名称,这边有个小技巧,之所有spring-data.mongodb中有这样的注解,是为了能够让用户自定义字段名称,可以和实体类不一致,还有个好处就是可以用缩写,比如username我们可以配置成unane或者un,这样的好处是节省了存储空间,mongodb的存储方式是key value形式的,每个key就会重复存储,key其实就占了很大一份存储空间。

接下来可以操作数据库了,接着上次,在测试类里写代码

复制代码@Autowired
private MongoTemplate mongoTemplate;/*** 初始化文章信息* @author yinjihuan*/
public static void initArticle() {//循环添加for (int i = 0; i < 10; i++) {Article article = new Article();article.setTitle("MongoTemplate的基本使用");article.setAuthor("yinjihuan");article.setUrl("http://cxytiandi.com/blog/detail/" + i);article.setTags(Arrays.asList("java", "mongodb", "spring"));article.setVisitCount(0L);article.setAddTime(new Date());mongoTemplate.save(article);}//批量添加List<Article> articles = new ArrayList<>(10);for (int i = 0; i < 10; i++) {Article article = new Article();article.setTitle("MongoTemplate的基本使用");article.setAuthor("yinjihuan");article.setUrl("http://cxytiandi.com/blog/detail/" + i);article.setTags(Arrays.asList("java", "mongodb", "spring"));article.setVisitCount(0L);article.setAddTime(new Date());articles.add(article);}mongoTemplate.insert(articles, Article.class);}

在数据量大的情况下批量添加性能会更好哦。

删除操作

复制代码//删除author为yinjihuan的数据
Query query = Query.query(Criteria.where("author").is("yinjihuan"));
mongoTemplate.remove(query, Article.class);
复制代码//如果实体类中没配集合名词,可在删除的时候单独指定article_info
query = Query.query(Criteria.where("author").is("yinjihuan"));
mongoTemplate.remove(query, "article_info");
复制代码//删除集合,可传实体类,也可以传名称
mongoTemplate.dropCollection(Article.class);
mongoTemplate.dropCollection("article_info");
复制代码//删除数据库
mongoTemplate.getDb().dropDatabase();

下面这2种适合要知道删除的数据有哪些的场景,比如记录删除的记录

复制代码//查询出符合条件的第一个结果,并将符合条件的数据删除,只会删除第一条
query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findAndRemove(query, Article.class);
复制代码//查询出符合条件的所有结果,并将符合条件的所有数据删除
query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.findAllAndRemove(query, Article.class);

修改操作

首先初始化需要修改的数据

复制代码{"_id": ObjectId("57c43caed4c63d7e39b5dc48"),"title": "MongoTemplate的基本使用","url": "http://cxytiandi.com/blog/detail/0","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 0,"add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{"_id": ObjectId("57c43caed4c63d7e39b5dc49"),"title": "MongoTemplate的基本使用","url": "http://cxytiandi.com/blog/detail/1","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 0,"add_time": ISODate("2016-08-29T13:46:22.201Z")
}

复制代码//修改第一条author为yinjihuan的数据中的title和visitCount
Query query = Query.query(Criteria.where("author").is("yinjihuan"));
Update update = Update.update("title", "MongoTemplate").set("visitCount", 10);
mongoTemplate.updateFirst(query, update, Article.class);

修改后结果如下,我们会发现第一条数据的title还有visit_count被修改了

复制代码{"_id": ObjectId("57c43caed4c63d7e39b5dc48"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/0","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{"_id": ObjectId("57c43caed4c63d7e39b5dc49"),"title": "MongoTemplate的基本使用","url": "http://cxytiandi.com/blog/detail/1","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 0,"add_time": ISODate("2016-08-29T13:46:22.201Z")
}

复制代码//修改全部符合条件的
query = Query.query(Criteria.where("author").is("yinjihuan"));
update = Update.update("title", "MongoTemplate").set("visitCount", 10);
mongoTemplate.updateMulti(query, update, Article.class);

修改后结果如下,我们会发现所有数据的title还有visit_count被修改了

复制代码{"_id": ObjectId("57c43caed4c63d7e39b5dc48"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/0","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{"_id": ObjectId("57c43caed4c63d7e39b5dc49"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/1","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:22.201Z")
}

复制代码//特殊更新,更新author为jason的数据,如果没有author为jason的数据则以此条件创建一条新的数据
//当没有符合条件的文档,就以这个条件和更新文档为基础创建一个新的文档,如果找到匹配的文档就正常的更新。
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").set("visitCount", 10);
mongoTemplate.upsert(query, update, Article.class);

修改后结果如下,我们会发现新增了一条数据

复制代码{"_id": ObjectId("57c43caed4c63d7e39b5dc48"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/0","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{"_id": ObjectId("57c43caed4c63d7e39b5dc49"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/1","author": "yinjihuan","tags": ["java","mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:22.201Z")
}
{"_id": ObjectId("57c6e1601e4735b2c306cdb7"),"author": "jason","title": "MongoTemplate","visit_count": 10
}

复制代码//更新条件不变,更新字段改成了一个我们集合中不存在的,用set方法如果更新的key不存在则创建一个新的key
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").set("money", 100);
mongoTemplate.updateMulti(query, update, Article.class);

修改后结果如下,我们会发现新加了一个key

复制代码{"_id": ObjectId("57c6e1601e4735b2c306cdb7"),"author": "jason","title": "MongoTemplate","visit_count": 10,"money":100
}

复制代码//update的inc方法用于做累加操作,将money在之前的基础上加上100
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").inc("money", 100);
mongoTemplate.updateMulti(query, update, Article.class);

修改后结果如下,我们会发现money变成200

复制代码{"_id": ObjectId("57c6e1601e4735b2c306cdb7"),"author": "jason","title": "MongoTemplate","visit_count": 10,"money":200
}

复制代码//update的rename方法用于修改key的名称
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").rename("visitCount", "vc");
mongoTemplate.updateMulti(query, update, Article.class);
复制代码{"_id": ObjectId("57c6e1601e4735b2c306cdb7"),"author": "jason","title": "MongoTemplate","vc": 10,"money":200
}

复制代码//update的unset方法用于删除key
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").unset("vc");
mongoTemplate.updateMulti(query, update, Article.class);

修改后结果如下,我们会发现vc这个key被删除了

复制代码{"_id": ObjectId("57c6e1601e4735b2c306cdb7"),"author": "jason","title": "MongoTemplate","money":200
}

复制代码//update的pull方法用于删除tags数组中的java
query = Query.query(Criteria.where("author").is("yinjihuan"));
update = Update.update("title", "MongoTemplate").pull("tags", "java");
mongoTemplate.updateMulti(query, update, Article.class);

修改后结果如下,我们会发现tags里的java被删除了

复制代码{"_id": ObjectId("57c43caed4c63d7e39b5dc48"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/0","author": "yinjihuan","tags": ["mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{"_id": ObjectId("57c43caed4c63d7e39b5dc49"),"title": "MongoTemplate","url": "http://cxytiandi.com/blog/detail/1","author": "yinjihuan","tags": ["mongodb","spring"],"visit_count": 10,"add_time": ISODate("2016-08-29T13:46:22.201Z")
}

查询操作

查询,无论是关系型数据库还是mongodb这种nosql,都是使用比较多的,大部分操作都是读的操作。 mongodb的查询方式很多种,下面只列了一些常用的,比如: 1.=查询 2.模糊查询 3.大于小于范围查询 4.in查询 5.or查询 6.查询一条,查询全部 7.自己慢慢学习…

根据作者查询所有符合条件的数据,返回List

复制代码Query query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.find(query, Article.class);

只查询符合条件的第一条数据,返回Article对象

复制代码query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findOne(query, Article.class);

查询集合中所有数据,不加条件

复制代码articles = mongoTemplate.findAll(Article.class);

查询符合条件的数量

复制代码query = Query.query(Criteria.where("author").is("yinjihuan"));
long count = mongoTemplate.count(query, Article.class);

根据主键ID查询

复制代码article = mongoTemplate.findById(new ObjectId("57c6e1601e4735b2c306cdb7"), Article.class);

in查询

复制代码List<String> authors = Arrays.asList("yinjihuan", "jason");
query = Query.query(Criteria.where("author").in(authors));
articles = mongoTemplate.find(query, Article.class);

ne(!=)查询

复制代码query = Query.query(Criteria.where("author").ne("yinjihuan"));
articles = mongoTemplate.find(query, Article.class);

lt(<)查询访问量小于10的文章

复制代码query = Query.query(Criteria.where("visitCount").lt(10));
articles = mongoTemplate.find(query, Article.class);

范围查询,大于5小于10

复制代码query = Query.query(Criteria.where("visitCount").gt(5).lt(10));
articles = mongoTemplate.find(query, Article.class);

模糊查询,author中包含a的数据

复制代码query = Query.query(Criteria.where("author").regex("a"));
articles = mongoTemplate.find(query, Article.class);

数组查询,查询tags里数量为3的数据

复制代码query = Query.query(Criteria.where("tags").size(3));
articles = mongoTemplate.find(query, Article.class);

or查询,查询author=jason的或者visitCount=0的数据

复制代码query = Query.query(Criteria.where("").orOperator(Criteria.where("author").is("jason"),Criteria.where("visitCount").is(0)));
articles = mongoTemplate.find(query, Article.class);

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试学习笔记1】测试基础

1.软件测试的定义 软件的定义&#xff1a;控制计算机硬件工作的工具 软件的基本组成&#xff1a;页面客户端&#xff0c;代码服务器&#xff0c;数据服务器 软件产生的过程&#xff1a;需求产生&#xff08;产品经理&#xff09;&#xff0c;需求文档&#xff0c;设计效果图…

STM32之OLED显示

一、模块介绍 1、常见的显示设备 LED、数码管、点阵、LCD屏(1602/12864)、OLED屏(消费电子) 2、OLED屏的概述 OLED&#xff0c;即有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;又称为有机电激光显示&#xff08;Organic Electroluminesenc…

css宽度适应内容

废话不多说,看如下demo,我需要将下面这个盒子的宽度变成内容自适应 方法有很多,如下 父元素设置display:flex 实现子元素宽度适应内容 如下给父元素设置flex能实现宽度自适应内容 <!DOCTYPE html><html lang"en"><head><meta charset"U…

C++每日一练(15):简单幂计算

题目描述 输入两个数a和b&#xff0c;求a的b次方。 输入 输入两个整数a&#xff0c;b&#xff08;1<a<10&#xff0c;1<b<15&#xff09;。 输出 输出一个正整数&#xff0c;该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…

C++常用类

1、QString 字符串类 QString 是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c;不再使用ASCII编码。QString使用的Unicode编码。 QString 完全支持中文&#xff0c; 但是由于不同的技术可能会采用不同的编码。有时候也会遇到中文编码的一致性问题。 如果后续的学习…

无人机测绘助力实现高效、安全的城市规划

随着城市化进程的不断加快&#xff0c;城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具&#xff0c;为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析&#xff0c;为行业提供有力的决策支持&#xff0c;助力城市规划的现代化和可持续发…

LeetCode刷题---基本计算器

解题思路&#xff1a; 根据题意&#xff0c;字符串中包含的运算符只有和- 使用辅助栈的方法来解决该问题 定义结果集res和符号位sign(用于判断对下一数的加减操作),接着对字符串进行遍历。 如果当前字符为数字字符&#xff0c;判断当前字符的下一个字符是否也是数字字符&#x…

决战排序之巅(二)

决战排序之巅&#xff08;二&#xff09; 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序&#xff08;Release版本&#xff09;说明1w rand( ) …

Kafka 消息不能正常消费问题排查

订单宽表数据不同步 事情的起因是专员在 ze app 上查不到订单了&#xff0c;而订单数据是从 mysql 的 order_search_info 查询的&#xff0c;order_search_info 表的数据是从 oracel 的 BZ_ORDER_INFO 表同步过来的&#xff0c;查不到说明同步有问题 首先重启&#xff0c;同步…

【K8S 】K8S配置资源管理

一、Secret&#xff1a; 1、概念 用来保存密码。token&#xff0c;敏感的K8S资源 这类数据可以直接存放在镜像中&#xff0c;但是放在Secret中可以更方便的控制&#xff0c;减少暴露的风险 Secret&#xff1a;保存加密的信息 2、Secret类型&#xff1a; docker-registry&am…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.5 Java与协程12.5.1 内核线程的局限12.5.2 协程的复苏12.5.3 Java的解决方案 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式&#xff1a;使用内核线程实现&#xff08;1&#…

算法通关村第十六关—滑动窗口与堆结合(黄金)

滑动窗口与堆结合 堆与滑动窗口问题的结合 LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位&#xff0c;返回滑动窗口中的最大值。  对于最大值、K个最大这种场…

【教3妹学编程-算法题】最大频率元素计数

2哥 : 3妹&#xff0c;最近有个电视剧《繁花》非常火&#x1f525;&#xff0c;你听说了吗&#xff1f; 3妹&#xff1a;没有&#xff0c;最近一直在忙着找工作&#xff0c;哪有时间看电视啊 2哥 : 啊&#xff1f;大周末还不休息一下啊&#xff0c;这么辛苦。 3妹&#xff1a;当…

压力测试JMeter

一、JMeter概述 Apache JMeter是100%纯JAVA桌面应用程序&#xff0c;被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能&#xff0c;例如&#xff1a;静态文件&#xff0c;Java Servlet,CGI Scripts,Java Object,数据库和FTP服务…

k8s node节点加入集群,token过期

1、master01节点执行 kubeadm token create --print-join-command 2、执行命令 kubeadm join 192.168.0.236:16443 --token qucd8q.hsfq4a1afluzaky3 --discovery-token-ca-cert-hash sha256:92175a356db070deb2ddd3823e288e3005a4baeec9b68580dcc11ce4d3767195 3、查看node02…

FPGA节省资源篇------正确处理设计优先级

声明&#xff1a;以下文章来源于孤独的单刀&#xff0c;仅供学习用途 概述 假如现在有一种方法–可以在不怎么需要修改已有设计的情况下&#xff0c;就可以帮您节省50%的设计资源&#xff0c;那你会试试看吗&#xff1f; 当前市场环境下&#xff0c;更低廉的成本却可获得同等…

steam游戏搬砖项目还能火多久?

最近放假回到老家&#xff0c;见了不少亲戚朋友&#xff0c;大家不约而同都在感叹今年大环境不好&#xff0c;工作不顺&#xff0c;生意效益不好&#xff0c;公司状况不佳&#xff0c;反问我们生意如何&#xff1f;为了让他们心里好受一点&#xff0c;我也假装附和道:也不咋地&…

3000多个厂商默认帐号、默认密码

做网工这行&#xff0c;多少都会遇上各种各样的厂商设备&#xff0c;遇上一些新设备&#xff0c;虽然没有更改密码&#xff0c;但不知道初始默认账号和密码是啥。 今天就给你整理了一波&#xff0c;三千多个厂商默认帐号、默认密码&#xff0c;方便你查阅。 不过&#xff0c;…

自创C++题目——风扇

预估难度 简单 题目描述 有一个风扇&#xff0c;它有个旋转叶片&#xff0c;每个旋转叶片的编号是&#xff0c;请输出它旋转后&#xff0c;中心点与地面的直线距离哪个叶片最近&#xff0c;输出此旋转叶片的编号。默认以“”的形式。 当时&#xff1a; 当或时&#xff0c;…

MATLAB二维与三维绘图实验

本文MATLAB源码&#xff0c;下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740747 一、实验目的 掌握图形对象属性的基本操作。掌握利用图形对象进行绘图操作的方法。 二、实验内容 利用图形对象绘制曲线&#xff…