springboot~mongo内嵌集合的操作
对于mongodb的内嵌对象的各种操作大叔在.net平台时已经说过,同时大叔也自己封装过mongo的仓储,使用也都很方便,而在java springboot框架里当然也有对应的方法,下面主要说一下,希望对刚接触mongodb的同学有所帮助!
一 测试DEMO的数据结构
/**
* 地址.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address { /**
* 编号.
*/
@Id
private String id;
/**
* 省.
*/
private String province;
/**
* 市.
*/
private String city;
/**
* 区.
*/
private String district;
/**
* 状态.
*/
private Status status;
/**
* 扩展.
*/
private List<AddressExtension> addressExtension;
}
其中它有一个内嵌的集合对象,addressExtension,我们添加了一些测试数据,如图:
下面介绍几种常用的数据操作:
/**
* 获取数据.
*
* @param province 省
* @param city 市
* @return
*/
@Override
public Address findByProvinceAndCity(String province, String city) {
Query query = new Query(Criteria.where("province").is(province).and("city").is(city));
return mongoTemplate.findOne(query, Address.class, "address");
} /**
* 更新字段.
*
* @param address .
*/
@Override
public void updateCity(Address address) {
Query query = new Query(Criteria.where("_id").is(address.getId()));
Update update = Update.update("city", address.getCity());
mongoTemplate.upsert(query, update, Address.class);
} /**
* 添加内嵌文档中的数据.
*
* @param id .
* @param info .
*/
@Override
public void addAddressInfo(String id, String info) {
Query query = Query.query(Criteria.where("_id").is(id));
AddressExtension ext = new AddressExtension();
ext.setInfo(info);
Update update = new Update();//update.push("Students", student);
// addToSet如果数据已经存在,则不做任何操作,而push会插入一条一样的数据
update.addToSet("addressExtension", ext);
mongoTemplate.upsert(query, update, Address.class);
} /**
* 更新内嵌文档里某条元素
*
* @param oldInfo
* @param newInfo
*/
@Override
public void updateAddressInfo(String oldInfo, String newInfo) {
Query query = new Query(Criteria.where("addressExtension.info").is(oldInfo));
Update update = new Update();
update.set("addressExtension.$.info", newInfo);
mongoTemplate.upsert(query, update, Address.class); } /**
* lambda filter.
* @param list
* @param predicate
* @return
*/
public List<AddressExtension> conditionFilter(List<AddressExtension> list, Predicate<AddressExtension> predicate){
return list.stream().filter(predicate).collect(Collectors.toList());
} /**
* 删除内嵌文档中的数据.
*
* @param id .
* @param addressExtension .
*/
@Override
public void delAddressInfo(String id, AddressExtension addressExtension) {
Query query = Query.query(Criteria.where("_id").is(id));
Update update = new Update();
update.pull("addressExtension", addressExtension);
mongoTemplate.updateFirst(query, update, Address.class);
} /**
* 删除文档.
*
* @param id .
*/
@Override
public void delAddress(String id) {
Query query = Query.query(Criteria.where("_id").is(id));
mongoTemplate.remove(query, Address.class);
}
其中,更新内嵌集合比较特别,它使用了集合元素的下标进行更新,$就是表示当前要更新的元素的下标!
感谢阅读!
springboot~mongo内嵌集合的操作的更多相关文章
- 补习系列(17)-springboot mongodb 内嵌数据库
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- SpringBoot优化内嵌的Tomcat
SpringBoot测试版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId ...
- MongoDB内嵌文档操作
实体定义: [BsonIgnoreExtraElements] public class Person : BaseEntity { public string FirstName { get; se ...
- springboot去除内嵌tomcat和打包在tomcat中运行需要做的步骤
去除内嵌tomcat和添加jsp依赖 去除内嵌tomcat 在springboot启动依赖中去除内嵌tomcat <dependency> <groupId>org.sprin ...
- SpringBoot Boot内嵌Tomcat
Spring Boot: SpringBoot-start-web 里面依赖的环境中 如果是外部的Tomcat 容器,可以通过修改config进行配置 内嵌的呢? 如何定制和修改Servlet容器的相 ...
- SpringBoot 优化内嵌的Tomcat
在通过SpringBoot调用其它服务时,报错 org.springframework.web.client.ResourceAccessException: I/O error on POST re ...
- SpringBoot优化内嵌的Tomcat ---设置MaxConnections
使用kill -9杀掉springboot应用后,立马java -jar重启,会报错,需要等待一段时间才能启动成功,报错的原因是:/tmp/tomcat-docbase.474979491043437 ...
- springBoot定制内嵌的Tomcat
此篇仅介绍配置方式,详细配置内容百度查阅 工程结构: 可以通过配置的方式设置参数,如下 application.properties #配置tomcat端口 # server.port= 8888 # ...
随机推荐
- FPGA学习笔记(五)—— 组合逻辑电路功能的描述
设计方法: 分析真值表规律 两种描述方式: 方式1:用assign描述,用阻塞赋值= 方式2:用always@(*)描述,用非阻塞赋值<= 选择功能的三种描述方式: ...
- 去除vue项目中的#及其ie9兼容性
一.如何去除vue项目中访问地址的# vue2中在路由配置中添加mode(vue-cli创建的项目在src/router/index.js) export default new Router({ m ...
- 使用 NLog 给 Asp.Net Core 做请求监控
为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...
- java基础系列之ConcurrentHashMap源码分析(基于jdk1.8)
1.前提 在阅读这篇博客之前,希望你对HashMap已经是有所理解的,否则可以参考这篇博客: jdk1.8源码分析-hashMap:另外你对java的cas操作也是有一定了解的,因为在这个类中大量使用 ...
- 实时监听input输入框value的变化:
HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件实时监听输入框value的变化 oninput 事件在用户输入时触发. 该事件在 <input&g ...
- Vue之生命周期函数和钩子函数详解
在学习vue几天后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的.因为我们有时候会在几个钩子函 ...
- javascript数组的常用算法解析
一.不改变原数组,返回新数组(字符串) 1.concat() 连接两个或者多个数组,两边的原始数组都不会变化,返回的是被连接数组的一个副本. 2.join() 把数组中所有的元素放入到一个字符串 ...
- javascript深入理解--作用域,作用域链,闭包的面试题解
一.概要 作用域和作用域链是js中非常重要的特性,关系到理解整个js体系,闭包是对作用域的延伸,其他语言也有闭包的特性. 那什么是作用域?作用域指的是一个变量和函数的作用范围. 1.js中函数内声明的 ...
- 用C语言做一个横板过关类型的控制台游戏
前言:本教程是写给刚学会C语言基本语法不久的新生们. 因为在学习C语言途中,往往只能写控制台代码,而还能没接触到图形,也就基本碰不到游戏开发. 所以本教程希望可以给仍在学习C语言的新生们能提前感受到游 ...
- 在已有的Asp.net MVC项目中引入Taurus.MVC
Taurus.MVC是一个优秀的框架,如果要应用到已有的Asp.net MVC项目中,需要修改一下. 1.前提约定: 走Taurus.MVC必须指定后缀.如.api 2.原项目修改如下: web.co ...