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 # ...
随机推荐
- 【ShoppingWebCrawler】-基于Webkit内核的爬虫蜘蛛引擎概述
写在开头 在各个电商平台发展日渐成熟的今天.很多时候,我们需要一些平台上的基础数据.比如:商品分类,分类下的商品详细,甚至业务订单数据.电商平台大多数提供了相应的业务接口.允许ISV接入,用来扩展自身 ...
- Integer的疑惑
1.Integer m =200; Integer n =200; System.out.println(m==n); 输出falseInteger x =6; Integer y=6; System ...
- Golang 通用连接池库 Golang-Pool
Golang 实现的连接池 功能: * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池 ...
- bzoj5342 CTSC2018 Day1T3 青蕈领主
首先显然的是,题中所给出的n个区间要么互相包含,要么相离,否则一定不合法. 然后我们可以对于直接包含的关系建出一棵树,于是现在的问题就是给n个节点分配权值,使其去掉最后一个点后不存在非平凡(长度大于1 ...
- 如何解决在ie下,Echarts多次使用setOption更改数据时,数据错乱问题
一.问题描述 根据用户的操作,通过Ajax请求,获取某段时间内的某数据趋势折线图数据.用户切换数据项或更改时间段时,ie中渲染的折线图包含了上一次获取的数据,导致数据错乱,如下图所示: 二.代码 数据 ...
- Android性能优化-内存泄漏的8个Case
1为什么要做性能优化? 手机性能越来越好,不用纠结这些细微的性能? Android每一个应用都是运行的独立的Dalivk虚拟机,根据不同的手机分配的可用内存可能只有(32M.64M等),所谓的4GB. ...
- C++的代理类
怎样在一个容器中包含类型不同,但是彼此有关系的对象?众所周知,C++的容器只能存放类型相同的元素,所以直接在一个容器中存储不同类型的对象本身是不可能的,只能通过以下两种方案实现: 1. 提供一个间接层 ...
- 100 天从 Python 新手到大师
Python应用领域和就业形势分析 简单的说,Python是一个“优雅”.“明确”.“简单”的编程语言. 学习曲线低,非专业人士也能上手 开源系统,拥有强大的生态圈 解释型语言,完美的平台可移植性 支 ...
- 死磕 java集合之ConcurrentLinkedQueue源码分析
问题 (1)ConcurrentLinkedQueue是阻塞队列吗? (2)ConcurrentLinkedQueue如何保证并发安全? (3)ConcurrentLinkedQueue能用于线程池吗 ...
- Python动态绑定属性slots的使用
当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.废话不多说,我们看一个例子: class Person(object): pass ...