Spring Boot中快速操作Mongodb

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.mzph.cn/news/629897.shtml

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

相关文章

ATA-1222A宽带放大器在二极管测试中的应用有哪些

宽带放大器是一种用于放大高频信号的电子设备&#xff0c;它在二极管测试中有多种应用。下面安泰电子将介绍宽带放大器在二极管测试中的几种常见应用。 宽带放大器可以用于二极管参数测试。二极管是一种常见的半导体器件&#xff0c;有正向电压-电流特性和反向电压-电流特性。为…

【2.5操作系统】数据传输控制方式

目录 1.输入输出技术2.IO设备管理软件 1.输入输出技术 cpu控制&#xff08;主存/外设&#xff09;进行数据交互的过程。 中断处理操作过程&#xff1a; 例题一: 解析&#xff1a; 第一问&#xff1a;选D。中断需要cpu发送中断指令。 例题二&#xff1a; 解析&#xff1a; 第…

css-实现溢出内容转换为...格式

代码&#xff1a;overflow: hidden; text-overflow: ellipsis; overflow: hidden;//当容器中的内容超出容器的尺寸时&#xff0c;将隐藏超出部分而不显示滚动条。 display: -webkit-box;//使用WebKit引擎的浏览器&#xff08;如Chrome和Safari&#xff09;中&#xff0c;将容器…

AI数字人短视频变现项目:打造短视频运营变现新模式

随着社交媒体和短视频平台的兴起&#xff0c;越来越多的人开始关注如何将短视频变现。在这个时代&#xff0c;创新和科技成为了推动变现模式发展的关键。AI数字人作为一种全新的创新形式&#xff0c;正在迅速进入人们的视野。本文将介绍AI数字人短视频变现项目&#xff0c;以及…

Mysql 安装通过mysql installer安装+配置环境+连接可视化工具

注意&#xff1a;不适合纯小白&#xff0c;小白建议移步别的大佬MySQL详细安装教程 目录 注意&#xff1a;不适合纯小白&#xff0c;小白建议移步别的大佬MySQL详细安装教程 前言 准备工作 一、Mysql下载 二、MySQL installer 安装以及系统环境配置 三、检验MySQL 四、可…

抖店商家怎么维护好与达人关系?2024新版维护达人思路方法

我是王路飞。 当你找到达人给你带货&#xff0c;且积累了一些达人资源之后&#xff0c;就需要维护好与达人的关系了。 毕竟找达人带货玩法的好处&#xff0c;就是长期稳定&#xff0c;他能给你带来持续的收益。 那么抖店商家应该如何维护好与达人的关系呢&#xff1f; 这篇…

【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!

最近学习MetaGPT&#xff0c;用到了 pip install -e . 安装命令&#xff0c;这个安装命令是从源代码安装包。 从源代码安装包有几个好处&#xff1a; 包内的代码是可见的&#xff0c;是白盒&#xff0c;不是黑盒&#xff0c;可以直接在项目中看源码断点调试可以直接断到源码里…

HCIA——10实验:跨路由转发。静态路由、负载均衡、缺省路由、手工汇总、环回接口。空接口与路由黑洞、浮动静态。

学习目标&#xff1a; 跨路由转发、负载均衡、环回接口、手工汇总、缺省路由、空接口与路由黑洞、浮动静态 学习内容&#xff1a; 跨路由转发静态路由、负载均衡、缺省路由、手工汇总。环回接口空接口与路由黑洞、浮动静态 目录 学习目标&#xff1a; 学习内容&#xff1a…

无/自监督去噪(1)——一个变迁:N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络&#xff08;BSNs&#xff0c;Blind Spot Networks&#xff09;开创者3.1. N2V实际是如何训练的&#xff1f; 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

电影《潜行》中说的蜜罐是什么(网络安全知识)

近期刘德华、彭于晏主演的电影《潜行》在网上掀起了轩然大波&#xff0c;电影中有提到网络蜜罐&#xff0c;这引起了很多观众的疑问&#xff0c;蜜罐到底是什么&#xff1f; 从字面意思上来看&#xff0c;蜜罐就是为黑客设下的诱饵。这是一种具有牺牲性质的计算机系统&#xff…

编程江湖:Python探秘之旅---- 旅程的终点,新的开始(结语)

项目终于成功上线&#xff0c;团队聚集在一起庆祝这一成就&#xff0c;并回顾了整个学习和开发的旅程。 龙&#xff1a;&#xff08;举杯&#xff09;恭喜大家&#xff0c;我们的项目成功上线了&#xff01;这是我们团队合作和不断学习的成果。 码娜&#xff1a;&#xff08;…

即将推出的 OpenWrt One/AP-24.XY:OpenWrt 和 Banana Pi 合作路由器板

OpenWrt开发人员正在与Banana Pi合作开发OpenWrt One/AP-24.XY路由器板。OpenWrt 是一个轻量级嵌入式 Linux 操作系统&#xff0c;支持近 1,800 个路由器和其他设备。然而&#xff0c;这将是第一块由 OpenWrt 直接开发的路由器板。 该主板将基于 MediaTek MT7981B (Filogic 82…

Linux下的shell命令执行set -ex 错误

shell脚本&#xff1a; #!/bin/bashset -exexport GOPATH/go ...(略)执行命令报错&#xff1a; $ ./build.sh : invalid option 2: set: - set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] ./build.sh: line 3: $\r: command not found ./build.sh: l…

.NET国产化改造探索(三)、银河麒麟安装.NET 8环境

随着时代的发展以及近年来信创工作和…废话就不多说了&#xff0c;这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来&#xff0c;看操作。 上一篇介绍了如何在银河麒麟操作系统上安装人大金仓数据库&#xff0c;这篇文章详细介绍下在银河麒麟操作系统上安装.NET8环境。…

c 不同类型数组的转换

1. 同类型之间利用指针 2. 同类型中间还可以全数组直接复制 3.不同类型&#xff1a;每个元素复制加强制转换类型 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void){char a[8]{1,2,3,4,5,6,7,8};//---转二维-指针---char (*b)…

Python 3 中如何使用 format 方法格式化字符串

介绍 Python的str.format()方法是 string 类的一部分&#xff0c;它允许您进行变量替换和值格式化。这使您能够通过位置格式化在字符串中连接元素。 本教程将指导您了解Python中格式化程序的一些常见用法&#xff0c;这可以使您的代码和程序更具可读性和用户友好性。 使用格…

JS-var 、let 、 const使用介绍

变量声明介绍 在我们日常开发用&#xff0c;变量声明有三个 var、 let 和 const&#xff0c;我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉…let or const ?建议&#xff1a; const 优先&#xff0c;尽量使…

【AI工具】使用 Whisper ASR 和 Pyannote 进行说话人分类

目录 前言 什么是说话人二值化? 什么是扬声器嵌入? 扬声器嵌入的关键作用 说话人分类系统的工作原理 执行

GPT-4 现在是否已经足够划算?

我通常使用 GPT 的方式是&#xff0c;先用 GPT-4 来快速搭建一个原型&#xff0c;然后不断优化&#xff0c;直到解决方案能够在 GPT-3.5 模型上运行。 这个方法在我的实践中非常高效&#xff0c;它的一个重要好处是能迅速筛选出那些“行不通”的项目——如果你在几天内都无法使…

Unity3D学习之UI系统——GUI

文章目录 1. 前言2. 工作原理和主要作用3. 基础控件3.1 重要参数及文本和按钮3.1.1 GUI 共同点3.1.2 文本控件3.1.3 按钮控件 3.2 多选框和单选框3.2.1 多选框3.2.2 单选框3.2.3 输入框3.2.4 拖动条 3.3 图片绘制和框3.3.1 图片3.3.2 框绘制 4 工具栏和选择网格4.1 工具栏4.2 选…