【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate

目录

一、导入依赖与配置信息

二、导入测试数据创建实体类

三、插入数据

1、Insert默认集合插入

2、Insert指定集合插入 

3、Insert批量插入数据 

 4、save默认集合插入

5、save指定集合插入 

6、insert与save的区别 

四、修改数据

1、修改符合条件的第一条数据

2、全部修改

五、删除数据

1、删除满足条件的所有文档

2、删除集合里所有文档

3、删除满足条件的单个文档并返回

4、删除满足条件的所有文档并返回

六、查找数据

1、查询全部文档

2、查询指定id的文档

3、查询满足条件的一条文档

4、查询满足条件的所有文档

5、And查询

6、Or查询

7、In查询

8、比较查询

9、正则查询

10、排序查询

11、分页查询

12、统计查询


一、导入依赖与配置信息

首先我们需要在项目中导入所需要的依赖,有两种方式:在项目创建之初选择对应的依赖

image.png

如果项目已经创建则在pom.xml文件中加入以下依赖

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

在依赖导入后,我们需要在项目的配置文件中配置相对应的信息

spring:data:mongodb:host: IPport: 27017database: 数据库

二、导入测试数据创建实体类

在MongoDB中导入数据

db.comment.insertMany([{_id:"1",nickname:"zs",content:"这是一本好书",userId:1,createTime:"2021-01-01T00:00:00",like:1,parentId:0},{_id:"2",nickname:"ls",content:"可是一本好书",userId:2,createTime:"2021-01-01T12:00:00",like:11,parentId:0},{_id:"3",nickname:"ls",content:"不是一本好书",userId:2,createTime:"2021-01-11T12:00:00",like:111,parentId:0}])

创建对应的实体类

package com.example.demo.pojo.mongodbVo;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;import java.io.Serializable;
import java.time.LocalDateTime;@Data
@Document(collection = "comment")
public class Comment implements Serializable {@Idprivate String id;private String nickname;private String content;@Indexedprivate Integer userId;private LocalDateTime createTime;private Integer like;private Integer parentId;
}

三、插入数据

1、Insert默认集合插入

命令:db.comment.insert({_id:"4",nickname:"ww",content:"这位是谁啊",userId:3,createTime:……})

这种方式插入数据会插入到实体类上Document注解对应的集合中

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {Comment comment = new Comment("4","ww","这位是谁啊",3, LocalDateTime.now(),1,0);mongoTemplate.insert(comment);}
}

2、Insert指定集合插入 

命令:db.comment.insert({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建数据Comment comment = new Comment("5","ww","这位是老师",3, LocalDateTime.now(),1,0);// 2. 存储数据库mongoTemplate.insert(comment,"comment");}
}

3、Insert批量插入数据 

命令:db.comment.insert([{},{}])

使用insert进行批量插入时必须指定集合名

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建数据Comment comment1 = new Comment("4","ww","这位是老师啊",3, LocalDateTime.now(),1,0);Comment comment2 = new Comment("6","ww","这位是啊",3, LocalDateTime.now(),1,0);List<Comment> list = new ArrayList<>();list.add(comment1);list.add(comment2);// 2. 存储数据库mongoTemplate.insert(list,"comment");}
}

 4、save默认集合插入

命令:db.comment.save({})

使用save进行插入时会根据id进行判断,如果要插入数据中的id在数据库存在,则会将旧的数据覆盖,如果不存在则插入数据

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建数据Comment comment = new Comment("4","ww","这位是老师啊12",3, LocalDateTime.now(),1,0);// 2. 存储数据库mongoTemplate.save(comment);}
}

5、save指定集合插入 

命令:db.comment.save({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建数据Comment comment = new Comment("4","ww","这位是老师啊12",3, LocalDateTime.now(),1,0);// 2. 存储数据库mongoTemplate.save(comment,"comment");}
}

6、insert与save的区别 

在MongoTemplate中,save()和insert()方法有以下区别:

  1. save()方法:save()方法用于插入新文档或更新现有文档。如果要保存的文档没有id字段,将插入一个新文档。如果文档具有id字段,MongoDB将尝试使用匹配的id值更新文档。如果找不到具有匹配id的文档,则插入一个新文档。
     
  2. insert()方法:insert()方法用于向集合中插入新文档。如果要插入的文档已经具有id字段,并且集合中已经存在具有相同id值的文档,则会抛出异常。这确保插入的文档具有唯一的_id值。

    总结:save()方法用于插入和更新操作,而insert()方法专门用于插入新文档,并确保_id字段的唯一性。

四、修改数据

1、修改符合条件的第一条数据

命令:db.comment.update({},{})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建更新的数据Comment comment = new Comment("4","ww","这位是老师啊12",3, LocalDateTime.now(),1,0);// 2. 构建更新的条件Query query = new Query(Criteria.where("id").is(comment.getId()));// 3. 构建更新值Update update = new Update().set("content",comment.getContent()).set("createTime",comment.getCreateTime());// 4. 更新第一条满足条件的数据UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);// 5. 判断是否更新System.out.println(update);}
}

2、全部修改

命令:db.comment.update({},{},{multi:true})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建更新的数据Comment comment = new Comment("4","ww","修改全部数据",3, LocalDateTime.now(),1,0);// 2. 构建更新的条件Query query = new Query(Criteria.where("nickname").is(comment.getNickname()));// 3. 构建更新值Update update = new Update().set("content",comment.getContent()).set("createTime",comment.getCreateTime());// 4. 更新第一条满足条件的数据UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class);// 5. 判断是否更新System.out.println(update);}
}

五、删除数据

1、删除满足条件的所有文档

命令:db.comment.remove({})


@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建筛选条件Query query = new Query(Criteria.where("userId").is(2));// 2. 执行删除操作DeleteResult remove = mongoTemplate.remove(query, Comment.class);}
}

2、删除集合里所有文档

命令:db.comment.remove({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 执行删除操作DeleteResult remove = mongoTemplate.remove(new Query(), Comment.class);}
}

3、删除满足条件的单个文档并返回

命令:db.comment.remove({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 构建删除条件Query query = new Query(Criteria.where("userId").is(1));// 2. 删除数据接收返回的文档Comment andRemove = mongoTemplate.findAndRemove(query, Comment.class);// 3. 打印删除的文档System.out.println(andRemove);}
}

4、删除满足条件的所有文档并返回

命令:db.comment.remove({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 删除所有满足条件并返回List<Comment> comments = mongoTemplate.findAllAndRemove(new Query(Criteria.where("userId").is(3)), Comment.class);// 2. 打印删除System.out.println(comments);}
}

六、查找数据

1、查询全部文档

命令:db.comment.find()

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询全部文档List<Comment> comments = mongoTemplate.findAll(Comment.class);// 2. 打印结果System.out.println(comments);}
}

2、查询指定id的文档

命令:db.comment.find({_id:"id"})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档Comment comment = mongoTemplate.findById("1", Comment.class);// 2. 打印结果System.out.println(comment);}
}

3、查询满足条件的一条文档

命令:db.comment.findOne({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档Comment comment = mongoTemplate.findOne(new Query(Criteria.where("nickname").is("ww")),Comment.class);// 2. 打印结果System.out.println(comment);}
}

4、查询满足条件的所有文档

命令:db.comment.find({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档List<Comment> comments = mongoTemplate.find(new Query(Criteria.where("nickname").is("ww")),Comment.class);// 2. 打印结果System.out.println(comments);}
}

5、And查询

命令:db.comment.find({$and:[{},{}]})

@SpringBootTest
public class PersonServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void findByAndCondition() {// 1.创建将要and的条件Criteria criteriaNickName = Criteria.where("nickame").is("ww");Criteria criteriaLike = Criteria.where("like").is(1);// 2.将上面条件进行and关联Criteria criteria = new Criteria().andOperator(criteriaNickName, criteriaLike);// 3.条件对象添加到其中Query query = new Query(criteria);List<Comment> result = mongoTemplate.find(query, Comment.class);System.out.println("查询结果:" + result.toString());}
}

6、Or查询

命令:db.comment.find({$or:[{},{}]})

下面代码简写,具体可参照上述and写法,效果一致

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档List<Comment> comments = mongoTemplate.find(new Query(new Criteria().orOperator(Criteria.where("nickname").is("ww"),Criteria.where("like").is(10))), Comment.class);// 2. 打印结果System.out.println(comments);}
}

7、In查询

命令:db.comment.find({count:{$in:[11,12]}})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档List<Integer> ins = Arrays.asList(1,0,2);List<Comment> comments = mongoTemplate.find(new Query(Criteria.where("like").in(ins)), Comment.class);// 2. 打印结果System.out.println(comments);}
}

8、比较查询

命令:db.comment.find({ "like": { $gt: 0, $lt: 5 } })

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档Query query = new Query(Criteria.where("like").gt(0).lt(5));   // 查询大于0小于5List<Comment> comments = mongoTemplate.find(query, Comment.class);// 2. 打印结果System.out.println(comments);}
}

9、正则查询

命令:db.collectionName.find({ "nickname": { $regex: '^w' } })

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档List<Comment> comments = mongoTemplate.find(new Query(Criteria.where("nickname").regex("^w")), Comment.class);  // 查询nickname中w开头的数据// 2. 打印结果System.out.println(comments);}
}

10、排序查询

命令:db.collectionName.find({ "nickname": "ww" }).sort({ "like": 1 })

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档Query query = new Query(Criteria.where("nickname").is("ww")).with(Sort.by("id").descending());List<Comment> comments = mongoTemplate.find(query, Comment.class);// 2. 打印结果System.out.println(comments);}
}

 

11、分页查询

命令:db.comment.find({}).skip(2).limit(2)

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档Query query = new Query(Criteria.where("nickname").is("ww")).skip(2).limit(2);List<Comment> comments = mongoTemplate.find(query, Comment.class);// 2. 打印结果System.out.println(comments);}
}

12、统计查询

命令:db.comment.count({})

@SpringBootTest
class CommentServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testvoid testInsert() {// 1. 查询文档Query query = new Query(Criteria.where("nickname").is("ww"));long count = mongoTemplate.count(query, Comment.class);// 2. 打印结果System.out.println(count);}
}

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

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

相关文章

redis 原理 7:开源节流 —— 小对象压缩

Redis 是一个非常耗费内存的数据库&#xff0c;它所有的数据都放在内存里。如果我们不注意节约使用内存&#xff0c;Redis 就会因为我们的无节制使用出现内存不足而崩溃。Redis 作者为了优化数据结构的内存占用&#xff0c;也苦心孤诣增加了非常多的优化点&#xff0c;这些优化…

[PM]敏捷开发之Scrum总结

在项目管理中&#xff0c;不少企业和项目团队也发现传统的项目管理模式已不能很好地适应今天的项目环境的要求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;本文将为大家介绍Scrum敏捷项目管理以及应用方法。 什么是Scrum敏捷项目管理 敏捷项目管理作为新兴的项目管理模…

Java后台生成ECharts图片,并以Base64字符串返回

前言 通过echarts的jar包&#xff0c;Java后台生成一张图片&#xff0c;并把图片插入到word中。关于word插图片的代码在下一章。 需要用到的工具PhantomJS,Echarts-convert.js,jquery.js,echarts.js。 1.PhantomJS 介绍 PhantomJS是一个不需要浏览器的富客户端。 官方介绍&…

[保研/考研机试] 猫狗收容所 C++实现

题目描述&#xff1a; 输入&#xff1a; 第一个是n&#xff0c;它代表操作序列的次数。接下来是n行&#xff0c;每行有两个值m和t&#xff0c;分别代表题目中操作的两个元素。 输出&#xff1a; 按顺序输出收养动物的序列&#xff0c;编号之间以空格间隔。 源代码&#xff…

用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码

一、i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度&#xff0c;如果是vue2点几&#xff0c;记得安装i18n的8版本&#xff0c;不然会自动安装的最新版本&#xff0c;后面会报错哦&#xff0c;查询了下资料&#xff0c;好像最新版本是适配的vue3。 npm install vue-…

Attacks in NLP

一、 Introduction NLP对抗攻击是人工智能对抗攻击的一个重要的组成部分&#xff0c;但是最近几年才逐渐开始兴起&#xff0c;究其原因在于NLP对抗攻击与传统computer vision或者audio对抗攻击有很大的不同&#xff0c;主要在于值空间的连续性&#xff08;CV、audio&#xff0…

04-6_Qt 5.9 C++开发指南_QListWidget和QToolButton

文章目录 1. 实例简介2. 源码2.1 混合式界面设计2.2 mainwindow.h2.3 mainwindow.cpp 1. 实例简介 Qt 中用于项 (Item)处理的组件有两类&#xff0c;一类是 Item Views&#xff0c;包括 QListView、QTreeView、QTableView、QColumnView 等;另一类是 Item Widgets&#xff0c;包…

C# 完成串口通信RS485

C# 完成串口通信RS485|RS232上下位机交互 第零步&#xff1a; 我用的是电脑usb 转串口的所以首先是驱动程序下载&#xff0c;我们用的是CH341 下载地址&#xff1a;https://www.wch.cn/downloads/CH341SER_EXE.html 第一步&#xff1a;连接机器 RS485 上面有三个端子&#xf…

深度学习与计算机相结合:直播实时美颜SDK的创新之路

时下&#xff0c;实时美颜技术就成为了直播主们的得力工具&#xff0c;它可以在直播过程中即时处理视频画面。而支持实时美颜功能的SDK更是推动了这项技术的发展&#xff0c;让直播主和普通用户都能轻松使用美颜功能。 一、美颜技术的演进 早期的美颜技术主要依赖于简单的图…

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

塔矢行洋对战藤原佐为,谁才是最接近神之一手的人

大家好, 我是嘉宾, 今天我们来盘点一下古今第一高手对局 &#xff0c;塔矢行洋对战藤原佐为&#xff0c;谁才是最接近神之一手的人&#xff0c; 在所有设定都点击好之后, 塔矢行洋下出了自己的第一步 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 佐…

【每日一题】—— B. Maximum Rounding(Codeforces Round 891 (Div. 3))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

VIM 编辑器: Bram Moolenaar

VIM 用了很长时间&#xff0c; 个人的 VIM 配置文件差不多10年没有更新了。以前写程序的时候&#xff0c; 编辑都用这个。 linux kernel&#xff0c; boost规模的代码都不在话下。现在虽然代码写的少了&#xff0c;依然是我打开文件的首选。 现在用手机了&#xff0c;配个蓝牙键…

无涯教程-Perl - endnetent函数

描述 此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。 语法 以下是此函数的简单语法- endnetent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perluse Socket;while ( ($name, $aliases, $addrtype, $net) getnetent() )…

Android 9-- 源码角度: Home键的监听和拦截

在做应用层APP需求的过程中&#xff0c;HOME键的监听&#xff0c;Back键的监听&#xff0c;这都是很常见的问题&#xff0c;那你有试过&#xff0c;去拦截HOME键的事件吗&#xff0c;有去了解过如何处理吗&#xff0c;流程如何 首先大家应该先了解一种情况&#xff0c;就是Andr…

Linux tun虚拟网卡通信初识

什么是linux tun设备 Linux TUN 设备是一种虚拟网络设备&#xff0c;用于在用户空间和内核空间之间建立数据通道&#xff0c;使用户空间程序可以通过这个设备与内核网络栈进行交互。TUN 设备是一种通用的网络隧道设备&#xff0c;常用于实现虚拟专用网络&#xff08;VPN&#…

【湍流介质的三维传播模拟器】全衍射3-D传播模拟器,用于在具有随机和背景结构的介质中传播无线电和光传播(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为OD机试(含B卷)真题2023 算法分类版,58道20个算法分类,如果距离机考时间不多了,就看这个吧,稳稳的

目录 一、数据结构1、线性表2、优先队列3、滑动窗口4、二叉树5、并查集6、栈 二、算法1、基础算法2、字符串3、图4、动态规划5、数学 三、漫画算法2&#xff1a;小灰的算法进阶参与方式 很多小伙伴问我&#xff0c;华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如…

中文版开源Llama 2同时有了语言、多模态大模型,完全可商用

可以说&#xff0c;AI 初创公司 LinkSoul.Al 的这些开源项目让海外开源大模型在国内的普及和推广速度与国际几乎保持了一致。 7 月 19 日&#xff0c;Meta 终于发布了免费可商用版本 Llama 2&#xff0c;让开源大模型领域的格局发生了巨大变化。 Llama 2 模型系列包含 70 亿、…