SpringBoot MongoTemplate使用详解

前面文章讲了 SpringBoot整合MongoDB JPA使用:https://blog.csdn.net/qq_42402854/article/details/139973336

在项目中,通常会 JPA语法与 MongoTemplate两者结合使用,特别是针对复杂动态条件查询时,MongoTemplate更加友好。

SpringBoot整合 MongoDB和前面文章一样,使用 @Autowired注入 MongoTemplate就可以直接使用。

一、增删改

1、插入文档

  • insert插入文档时,如果插入数据的主键已经存在,则会抛 DuplicateKeyException 键重复异常,不保存当前数据。支持批量。
  • save插入文档时,如果插入数据的主键已经存在,则会更新当前数据,如果不存在则会保存当前数据。不支持批量。JPA语法支持。
    @Testpublic void testInsert() {List<DeviceGpsDO> list = new ArrayList<>();DeviceGpsDO deviceGpsDO = new DeviceGpsDO();deviceGpsDO.setDeviceName("插入数据");deviceGpsDO.setSatelliteTime(new Date());deviceGpsDO.setLocation(new GeoJsonPoint(108.552500, 34.322700));deviceGpsDO.setLongitude(108.552500);deviceGpsDO.setLatitude(34.322700);list.add(deviceGpsDO);//  插入一个deviceGpsDO.setId("100");mongoTemplate.insert(deviceGpsDO);deviceGpsDO.setId(null);mongoTemplate.insert(deviceGpsDO, "mongoTemplate_insert");deviceGpsDO.setId(null);mongoTemplate.insert(deviceGpsDO, "mongoTemplate_insert");//  根据集合名称插入多个deviceGpsDO.setId(null);mongoTemplate.insert(list, DeviceGpsDO.class);deviceGpsDO.setId(null);mongoTemplate.insert(list, "mongoTemplate_insert");deviceGpsDO.setId(null);mongoTemplate.insertAll(list); 保存或者更新一个deviceGpsDO.setId("101");mongoTemplate.save(deviceGpsDO);mongoTemplate.save(deviceGpsDO, "mongoTemplate_save");deviceGpsDO.setSpeed(5.5F);mongoTemplate.save(deviceGpsDO, "mongoTemplate_save");// 保存或者更新多个不支持。保存信息:Couldn't find PersistentEntity for type java.lang.Object!//mongoTemplate.save(list);  //mongoTemplate.save(list, "mongoTemplate_save");}

2、更新文档

    @Testpublic void testUpdate() {Query query = Query.query(Criteria.where("_id").is("100"));Update update = Update.update("device_name", "更新数据").set("vin_no", "vin_no111").set("speed", 11).set("speed2", "2-1"); // 字段不存在则新增//  更新一条数据mongoTemplate.updateFirst(query, update, DeviceGpsDO.class);mongoTemplate.updateFirst(query, update, "mongoTemplate_save");mongoTemplate.updateFirst(query, update, DeviceGpsDO.class, "mongoTemplate_save");//  更新多条数据Query query2 = Query.query(Criteria.where("speed").gte(2));Update update2 = Update.update("device_name", "更新数据").set("vin_no", "vin_no222").set("speed", 22);mongoTemplate.updateMulti(query2, update2, DeviceGpsDO.class);mongoTemplate.updateMulti(query2, update2, "mongoTemplate_insert");mongoTemplate.updateMulti(query2, update2, DeviceGpsDO.class, "mongoTemplate_save");//  更新数据,如果数据不存在就新增mongoTemplate.upsert(query, update, DeviceGpsDO.class);mongoTemplate.upsert(query, update, "mongoTemplate_save");mongoTemplate.upsert(query2, update2, DeviceGpsDO.class, "mongoTemplate_update");}

3、删除文档

    @Testpublic void testSave(){DeviceGpsDO deviceGpsDO = new DeviceGpsDO();deviceGpsDO.setId("100");Query query = Query.query(Criteria.where("_id").in("667ad10d25e5aa38d6126339","667c33fc68e19b549ee24bfc"));//  根据条件删除mongoTemplate.remove(deviceGpsDO);mongoTemplate.remove(deviceGpsDO, "mongoTemplate_save");//  根据条件删除(可删除多条)mongoTemplate.remove(query, "mongoTemplate_insert");mongoTemplate.remove(query, DeviceGpsDO.class);mongoTemplate.remove(query, DeviceGpsDO.class,"mongoTemplate_insert");}

二、查询详解

使用 Query构建查询条件。

  • Criteria对象,用来封装所有的查询条件。
  • Query对象,用来封装所有的查询条件对象。

创建Criteria对象:

  • 方式一:直接 new对象 Criteria criteria = new Criteria();
  • 方式二:通过 Criteria.where()静态方法。比如:Criteria.where(“属性名”).is(“值”).and(“属性名”).gte(“值”)进行查询。

注意: Criteria的两种方式不能混合使用,否则不生效。

创建Query对象:

Query query = new Query(criteria);

1、精确查询

    @Testpublic void testQuery1(){//精确查询Criteria criteria = new Criteria();criteria.and("id").is("101");Query query = new Query(criteria);// { "_id" : "101"}DeviceGpsDO deviceGpsDO1 = mongoTemplate.findOne(query, DeviceGpsDO.class);DeviceGpsDO deviceGpsDO2 = mongoTemplate.findOne(query, DeviceGpsDO.class, "mongoTemplate_save");}

2、or查询

在 MongoTemplate 中 or 是用 orOperator表示的。

    @Testpublic void testQuery2(){//or查询Criteria criteria = new Criteria();criteria.and("_id").is("101").orOperator(Criteria.where("longitude").is(108.552500));Query query = new Query(criteria);// { "_id" : "101", "$or" : [{ "longitude" : 108.5525}]}List<DeviceGpsDO> deviceGpsDO1List = mongoTemplate.find(query, DeviceGpsDO.class);List<DeviceGpsDO> deviceGpsDO2List = mongoTemplate.find(query, DeviceGpsDO.class, "mongoTemplate_insert");}

3、范围查询

    @Testpublic void testQuery3(){//范围查询Criteria criteria = Criteria.where("speed").gte(1).lte(30).and("longitude").is(108.552500);Query query = new Query(criteria);// { "speed" : { "$gte" : 1, "$lte" : 30}, "longitude" : 108.5525}List<DeviceGpsDO> deviceGpsDO2List = mongoTemplate.find(query, DeviceGpsDO.class, "mongoTemplate_insert");}

4、时间范围查询

    @Testpublic void testQuery4(){//时间范围查询。 不用考虑时差,正常时间类型条件即可。Criteria criteria = Criteria.where("update_time").gte(LocalDateTimeUtil.parse("2024-06-27 15:00:00", DatePattern.NORM_DATETIME_PATTERN)).lte(LocalDateTimeUtil.parse("2024-06-27 23:59:59", DatePattern.NORM_DATETIME_PATTERN));Query query = new Query(criteria);// { "update_time" : { "$gte" : { "$date" : "2024-06-27T07:00:00Z"}, "$lte" : { "$date" : "2024-06-27T15:59:59Z"}}}List<DeviceGpsDO> deviceGpsDO2List = mongoTemplate.find(query, DeviceGpsDO.class, "mongoTemplate_insert");}

5、模糊查询

模糊查询以 【^】开始 以【$】结束 【.*】相当于Mysql中的【%】。

    @Testpublic void testQuery5() {//模糊查询/正则查询String deviceName = "数据";Pattern pattern = Pattern.compile("^.*" + deviceName + ".*$", Pattern.CASE_INSENSITIVE);Criteria criteria = Criteria.where("device_name").regex(pattern);Query query = new Query(criteria);// { "device_name" : { "$regularExpression" : { "pattern" : "^.*数据.*$", "options" : "i"}}}List<DeviceGpsDO> deviceGpsDO2List = mongoTemplate.find(query, DeviceGpsDO.class, "mongoTemplate_insert");}

6、排序查询

Sort对象通过参数 direction枚举指定排序方向,sortField 为排序字段。

    @Testpublic void testQuery6() {//排序查询String deviceName = "数据";Pattern pattern = Pattern.compile("^.*" + deviceName + ".*$", Pattern.CASE_INSENSITIVE);Criteria criteria = Criteria.where("device_name").regex(pattern);Query query = new Query(criteria);query.with(Sort.by(Sort.Direction.DESC, "update_time"));// {"find": "mongoTemplate_insert", "filter": {"device_name": {"$regularExpression": {"pattern": "^.*数据.*$", "options": "i"}}}, "sort": {"update_time": -1}, "$db": "ws_sb_local", "lsid": {"id": {"$binary": {"base64": "fUndebK2RXiOro31pR0F5w==", "subType": "04"}}}}List<DeviceGpsDO> deviceGpsDO2List = mongoTemplate.find(query, DeviceGpsDO.class, "mongoTemplate_insert");}

7、总数查询

    @Testpublic void testQuery7() {//总数查询String deviceName = "插入";Pattern pattern = Pattern.compile("^.*" + deviceName + ".*$", Pattern.CASE_INSENSITIVE);Criteria criteria = Criteria.where("device_name").regex(pattern);Query query = new Query(criteria);query.with(Sort.by(Sort.Direction.DESC, "update_time"));// {"aggregate": "mongoTemplate_insert", "pipeline": [{"$match": {"device_name": {"$regularExpression": {"pattern": "^.*插入.*$", "options": "i"}}}}, {"$group": {"_id": 1, "n": {"$sum": 1}}}], "cursor": {}, "$db": "ws_sb_local", "lsid": {"id": {"$binary": {"base64": "64gumgsaQMCw1vUDQEIKlg==", "subType": "04"}}}}long count1 = mongoTemplate.count(query, DeviceGpsDO.class, "mongoTemplate_insert");}

8、分页查询

在 MongoTemplate 中处理分页方式有三种:

  • PageRequest分页 - 推荐使用
  • limit限定条件查询
  • skip跳过指定数量的查询
    @Testpublic void testQuery8() {//分页查询推荐:PageRequestString deviceName = "数据";Pattern pattern = Pattern.compile("^.*" + deviceName + ".*$", Pattern.CASE_INSENSITIVE);Criteria criteria = Criteria.where("device_name").regex(pattern);Query query = new Query(criteria);// 总数量long total = mongoTemplate.count(query, DeviceGpsDO.class);// MongoDB 默认第一页是0, 公式为:(currentPage - 1) * pageSize, pageSizeint currentPage = 3;int pageSize = 10;Pageable pageable = PageRequest.of(currentPage - 1, pageSize, Sort.by(Sort.Direction.DESC, "update_time"));query.with(pageable);// 当前页数量long currentPageTotal = mongoTemplate.count(query, DeviceGpsDO.class);List<DeviceGpsDO> doList = this.mongoTemplate.find(query , DeviceGpsDO.class);log.info("currentPage = {}", currentPage);log.info("pageSize = {}", pageSize);log.info("currentPageTotal = {}", currentPageTotal);log.info("total = {}", total);log.info("totalPages = {}", (int) Math.ceil((double) total / (double) pageSize));log.info("doList = {}", doList);}

– 求知若饥,虚心若愚。

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

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

相关文章

主流国产服务器操作系统技术分析

主流国产服务器操作系统 信创 "信创"&#xff0c;即信息技术应用创新&#xff0c;作为科技自立自强的核心词汇&#xff0c;在我国信息化建设的进程中扮演着至关重要的角色。自2016年起步&#xff0c;2020年开始蓬勃兴起&#xff0c;信创的浪潮正席卷整个信息与通信技…

GNeRF代码复现

https://github.com/quan-meng/gnerf 之前一直去复现这个代码总是文件不存在&#xff0c;我就懒得搞了&#xff08;实际上是没能力哈哈哈&#xff09; 最近突然想到这篇论文重新试试复现 一、按步骤创建虚拟环境安装各种依赖等 二、安装好之后下载数据&#xff0c;可以用Blen…

virtualbox+Ubuntu部分窗口显示错乱

如下图&#xff1a; 窗口标题显示错乱&#xff0c;跟一般乱码不一样。 解决办法&#xff1a; 在virtualbox设置中&#xff0c;显示选项卡&#xff0c;取消勾选启用3D加速 也可参考此链接&#xff1a;linux ubuntu 中vscode中央窗口显示出现异常/显示错误_开发工具-CSDN问答

打卡第一天

今天是参加算法训练营的第一天&#xff0c;希望我能把这个训练营坚持下来&#xff0c;希望我的算法编程题的能力有所提升&#xff0c;不再面试挂了&#xff0c;面试总是挂编程题&#xff0c;记录我leetcode刷题数量&#xff1a; 希望我通过这个训练营能够实现两份工作的无缝衔接…

自动化任务工具 -- zTasker v1.94 绿色版

软件简介 zTasker 是一款功能强大的自动化任务管理软件&#xff0c;以其简洁易用、一键式操作而著称。软件体积小巧&#xff0c;启动迅速&#xff0c;提供了超过100种任务类型和30多种定时/条件执行方法&#xff0c;能够满足用户在自动化方面的多样化需求。 zTasker 支持定时任…

从全连接到卷积

一、全连接到卷积 1、卷积具有两个原则&#xff1a; 平移不变性&#xff1a;无论作用在哪个部分&#xff0c;它都要有相同的作用&#xff0c;而不会随着位置的改变而改变 局部性&#xff1a;卷积核作用处&#xff0c;作用域应该是核作用点的周围一小部分而不作用于更大的部分 …

OBD诊断(ISO15031) 04服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、清除/重置与排放相关的诊断信息请求消息定义2、请求与排放相关的DTC响应消息定义3、报文示例 ISO 15765-4的诊断服务定义1、请求与排放相关的DTC请求消息定义2、请求与排放相关的DTC响应消息定义3、否定响…

专题二:Spring源码编译

目录 下载源码 配置Gradle 配置环境变量 配置setting文件 配置Spring源码 配置文件调整 问题解决 完整配置 gradel.properties build.gradle settiings.gradel 在专题一&#xff1a; Spring生态初探中我们从整体模块对Spring有个整体的印象&#xff0c;现在正式从最…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务6:安装并配置Hadoop

任务描述 项目的运行环境为基于Hadoop的全分布式模式集群。 任务的主要内容为安装Hadoop分布式集群环境。 任务指导 Hadoop集群需要整个集群所有节点安装的Hadoop版本保持一致&#xff0c;并且拥有相同的配置 具体配置步骤如下&#xff1a; 1. 解压缩Hadoop的压缩包 2. …

AI产品经理需要哪些必备技能?如何成为AI产品经理?

1.AI产品经理是什么 回答这个问题前我们首先得理清楚什么是AI产品经理&#xff0c;它和传统的互联网产品经理有什么区别。 1.1 AI产品经理职责 主要职责一方面是规划如何将成熟的AI技术应用在各个领域不同场景中&#xff0c;提升原有场景的效率或效果等&#xff1b;另一方面…

在线医疗诊断平台开发教程大纲 (Java 后端,Vue 前端)—实践篇-02

第三步:创建实体类和 Mapper 文件 现在我们已经设计好了数据库表结构,接下来要使用 MyBatis 将这些表映射到 Java 对象,以便在代码中进行操作。 1. 创建实体类 在 src/main/java/<your_package>/entity 目录下 (如果没有该目录,请手动创建),创建与数据库表对应的实…

基于蜉蝣优化的聚类算法(MATLAB)

优化问题广泛存在于人们的日常生活和工程领域&#xff0c;其解决如何寻找使目标值达到最优的可行解的问题。伴随着科技发展&#xff0c;优化问题在生产调度、神经网络训练、图像处理、能源系统等领域起到举足轻重的作用&#xff0c;有助于提高系统效率。优化问题依据不同标准可…

探索Spring Boot:简化Java开发的新纪元

1. 引言 在Java开发的世界里,Spring Boot无疑是一颗璀璨的明星。自诞生以来,它以简化配置、快速开发、内嵌服务器等诸多优点迅速赢得了广大开发者的青睐。本篇博客将深入探讨Spring Boot的核心概念、特点以及其在现代Java开发中的优势,并通过详细的代码示例和实践经验,展示…

Docker安装PostgreSQL详细教程

本章教程,使用Docker安装PostgreSQL具体步骤。 一、拉取镜像 docker pull postgres二、启动容器 docker run -it --name postgres --restart always -e POSTGRES_PASSWORD=123456 -e

mac上修改jupyterlab工作目录

mac上使用anaconda中的jupyterlab。 修改默认的工作目录 upyter lab --generate-config Writing default config to: /Users/xxx/.jupyter/jupyter_lab_config.py vim /Users/xiece/.jupyter/jupyter_lab_config.py # 设置c.ServerApp.notebook_dir c.ServerApp.notebook_dir …

EXCEL返回未使用数组元素(未使用值)

功能简介&#xff1a; 在我们工作中&#xff0c;需要在EXCEL表列出哪些元素&#xff08;物品或订单&#xff09;已经被使用了&#xff08;或使用了多少次&#xff09;&#xff0c;哪些没有被使用。 当数量过于庞大时人工筛选或许不是好办法&#xff0c;我们可以借助公式&…

FlinkCDC 数据同步优化及常见问题排查

【面试系列】Swift 高频面试题及详细解答 欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、…

偏微分方程笔记

极小位能原理&#xff1a; C 2 C^2 C2 是一个集合符号&#xff0c;表示所有二阶连续可微函数的集合 弱导数 C 2 C^2 C2 是一个集合符号&#xff0c;表示所有二阶连续可微函数的集合。 C 0 ∞ ( I ) C^{\infty}_0(I) C0∞​(I)表示于 I I I上无穷可微&#xff0c;且在端点a&…

Java学习笔记(个人向)

1. 概述 每一个应用程序都以类名开头&#xff0c;类名必须与文件名匹配&#xff0c;所以保存文件时&#xff0c;要使用类名保存&#xff1b;java中运行的每一行代码都必须在一个class中&#xff1b;在类名的开头&#xff0c;可以用权限修饰符来解释&#xff0c;如private或者p…

【JavaScript脚本宇宙】高效Web开发利器:全面解析六大HTML解析器与DOM库

精益求精&#xff1a;揭秘六个改变Web开发的HTML解析与DOM操作工具 前言 在现代Web开发中&#xff0c;HTML解析器和DOM操作库是不可或缺的工具。无论是爬取数据、处理复杂的HTML文档&#xff0c;还是模拟浏览器环境&#xff0c;这些工具都扮演着关键角色。本文将深入探讨六个…