对于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内嵌集合的操作的更多相关文章

  1. 补习系列(17)-springboot mongodb 内嵌数据库

    目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...

  2. 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】

    目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...

  3. SpringBoot优化内嵌的Tomcat

    SpringBoot测试版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId ...

  4. MongoDB内嵌文档操作

    实体定义: [BsonIgnoreExtraElements] public class Person : BaseEntity { public string FirstName { get; se ...

  5. springboot去除内嵌tomcat和打包在tomcat中运行需要做的步骤

    去除内嵌tomcat和添加jsp依赖 去除内嵌tomcat 在springboot启动依赖中去除内嵌tomcat <dependency> <groupId>org.sprin ...

  6. SpringBoot Boot内嵌Tomcat

    Spring Boot: SpringBoot-start-web 里面依赖的环境中 如果是外部的Tomcat 容器,可以通过修改config进行配置 内嵌的呢? 如何定制和修改Servlet容器的相 ...

  7. SpringBoot 优化内嵌的Tomcat

    在通过SpringBoot调用其它服务时,报错 org.springframework.web.client.ResourceAccessException: I/O error on POST re ...

  8. SpringBoot优化内嵌的Tomcat ---设置MaxConnections

    使用kill -9杀掉springboot应用后,立马java -jar重启,会报错,需要等待一段时间才能启动成功,报错的原因是:/tmp/tomcat-docbase.474979491043437 ...

  9. springBoot定制内嵌的Tomcat

    此篇仅介绍配置方式,详细配置内容百度查阅 工程结构: 可以通过配置的方式设置参数,如下 application.properties #配置tomcat端口 # server.port= 8888 # ...

随机推荐

  1. windows.go

    func LockFile(file *os.File) error { h, err := syscall.LoadLibrary("kernel32.dll") if err ...

  2. .net core下使用Thrift

    因网站组(.net)与游戏服务端(c++)原来使用REST API通讯效率稍显低下,准备下期重构时改用rpc方式,经比较Thrift和gRPC两者的优劣(参照网上的对比结果),最终决定使用Thrift ...

  3. [HNOI2015]菜肴制作 拓扑序

    逆序最大字典序拓扑序 反向建边,逆序字典序最大.. #include<cstdio> #include<cstring> #include<iostream> #i ...

  4. laravel 中的rbac自己简单的实现

    用户表 CREATE TABLE `sys_user` ( `id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '用户编号', `ids` int(1 ...

  5. 启动链码报rpc error: code = Unimplemented desc = unknown service protos.ChaincodeSupport start error

    参考链接:https://stackoverflow.com/questions/48007519/unimplemented-desc-unknown-service-protos-chaincod ...

  6. TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)

    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...

  7. Java Native Interface调用C++代码

    概述 Java Native Interface译为Java原生接口,简称JNI.Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供 ...

  8. 作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?

    其实这个问题很简单,我用最简单的语言给大家描述一下,学习一样东西就要了解这样东西学完了要干什么事情,有什么作用.然后就是应该学习哪些必要的内容,该如何运用得当的方法进行有效率的学习不至于自己摸不着头脑 ...

  9. 我眼中的 Nginx(四):是什么让你的 Nginx 服务退出这么慢?

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  10. 设计模式 | 简单工厂模式(static factory method)

    按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...