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 # ...
随机推荐
- BZOJ_5301_[Cqoi2018]异或序列&&CF617E_莫队
Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...
- Netty基础系列(1) --linux网路I/O模型
引言 我一直认为对于java的学习,掌握基础的性价比要远远高于使用框架,而基础知识中对于网络相关知识的掌握也是重中之重.对于一个java程序来说,无论是工作中还是面试,对于Netty的掌握都是及其重要 ...
- <转>快速找到整数约数集方法<python><stackoverflow>
[背景] 我需要从N遍历到1,当我已经判断N不符合要求时,我知道N的所有约数也是不符合的,所以所有N的约数也不用遍历.因此,对于遍历的每个N,我需要快速找到它的所有约数,放到一个集合里面,而当我遍历到 ...
- 鸟哥的Linux私房菜笔记第四章
前言 对着<鸟哥的Linux私房菜-基础版>做了简化笔记.不想让自己知其然而不知其所然.所以写个博客让自己好好巩固一下,当然不可能把书中的内容全部写下来.在这里就简化一点把命令写下来. 让 ...
- Jenkins之Log Parse的使用
在初学使用Jenkins的同学们,应该都遇到过通过bash或者cmd命令执行输出的日志,没办法做到对error, warning等状态的分析和统计.在这里就给他介绍一款实现此功能的插件Log Pars ...
- android渠道打包怎样实现最方便
我们都知道,Android 市场被分割成几十个应用商店渠道,程序员给渠道打包.更新是一件异常繁杂又不得不做的工作,但现在有一种快捷灵活的免费多渠道统计方式,能最大程度的提高打包效率和数据安全性. 首先 ...
- C# 将object对象转换为实体对象
C# 将object对象转换为实体对象.一共两种方法. 第一种方法,代码如下: /// <summary> /// 将object对象转换为实体对象 /// </summary> ...
- 关于css兼容性问题及一些常见问题汇总
目前主流浏览器的兼容性做的都比较好了,本文主要针对IE6,7的不兼容问题进行解决. 1.圆盘时钟有浮动存在时,计算一定要精确,不要让内容的宽高超出我们所设置的宽高,IE6下,内容会撑开设置好的高度. ...
- arcgis api 3.x for js 地图加载多个 SHP 图层压缩以及 json 文件展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- oppo8.0系统怎么无需Root激活Xposed框架的经验
在较多部门的引流,或业务操作中,基本都需要使用安卓的神一般的xposed框架,近期我们部门购来了一批新的oppo8.0系统,基本都都是基于7.0以上版本,基本都不能够刷入root的su权限,虽说一部分 ...