对于mongodb的内嵌对象的各种操作大叔在.net平台时已经说过,同时大叔也自己封装过mongo的仓储,使用也都很方便,而在java springboot框架里当然也有对应的方法,下面主要说一下,希望对刚接触mongodb的同学有所帮助!

一 测试DEMO的数据结构

  1. /**
  2. * 地址.
  3. */
  4. @Data
  5. @NoArgsConstructor
  6. @AllArgsConstructor
  7. public class Address {
  8.  
  9. /**
  10. * 编号.
  11. */
  12. @Id
  13. private String id;
  14. /**
  15. * 省.
  16. */
  17. private String province;
  18. /**
  19. * 市.
  20. */
  21. private String city;
  22. /**
  23. * 区.
  24. */
  25. private String district;
  26. /**
  27. * 状态.
  28. */
  29. private Status status;
  30. /**
  31. * 扩展.
  32. */
  33. private List<AddressExtension> addressExtension;
  34. }

其中它有一个内嵌的集合对象,addressExtension,我们添加了一些测试数据,如图:

下面介绍几种常用的数据操作:

  1. /**
  2. * 获取数据.
  3. *
  4. * @param province 省
  5. * @param city 市
  6. * @return
  7. */
  8. @Override
  9. public Address findByProvinceAndCity(String province, String city) {
  10. Query query = new Query(Criteria.where("province").is(province).and("city").is(city));
  11. return mongoTemplate.findOne(query, Address.class, "address");
  12. }
  13.  
  14. /**
  15. * 更新字段.
  16. *
  17. * @param address .
  18. */
  19. @Override
  20. public void updateCity(Address address) {
  21. Query query = new Query(Criteria.where("_id").is(address.getId()));
  22. Update update = Update.update("city", address.getCity());
  23. mongoTemplate.upsert(query, update, Address.class);
  24. }
  25.  
  26. /**
  27. * 添加内嵌文档中的数据.
  28. *
  29. * @param id .
  30. * @param info .
  31. */
  32. @Override
  33. public void addAddressInfo(String id, String info) {
  34. Query query = Query.query(Criteria.where("_id").is(id));
  35. AddressExtension ext = new AddressExtension();
  36. ext.setInfo(info);
  37. Update update = new Update();//update.push("Students", student);
  38. // addToSet如果数据已经存在,则不做任何操作,而push会插入一条一样的数据
  39. update.addToSet("addressExtension", ext);
  40. mongoTemplate.upsert(query, update, Address.class);
  41. }
  42.  
  43. /**
  44. * 更新内嵌文档里某条元素
  45. *
  46. * @param oldInfo
  47. * @param newInfo
  48. */
  49. @Override
  50. public void updateAddressInfo(String oldInfo, String newInfo) {
  51. Query query = new Query(Criteria.where("addressExtension.info").is(oldInfo));
  52. Update update = new Update();
  53. update.set("addressExtension.$.info", newInfo);
  54. mongoTemplate.upsert(query, update, Address.class);
  55.  
  56. }
  57.  
  58. /**
  59. * lambda filter.
  60. * @param list
  61. * @param predicate
  62. * @return
  63. */
  64. public List<AddressExtension> conditionFilter(List<AddressExtension> list, Predicate<AddressExtension> predicate){
  65. return list.stream().filter(predicate).collect(Collectors.toList());
  66. }
  67.  
  68. /**
  69. * 删除内嵌文档中的数据.
  70. *
  71. * @param id .
  72. * @param addressExtension .
  73. */
  74. @Override
  75. public void delAddressInfo(String id, AddressExtension addressExtension) {
  76. Query query = Query.query(Criteria.where("_id").is(id));
  77. Update update = new Update();
  78. update.pull("addressExtension", addressExtension);
  79. mongoTemplate.updateFirst(query, update, Address.class);
  80. }
  81.  
  82. /**
  83. * 删除文档.
  84. *
  85. * @param id .
  86. */
  87. @Override
  88. public void delAddress(String id) {
  89. Query query = Query.query(Criteria.where("_id").is(id));
  90. mongoTemplate.remove(query, Address.class);
  91. }

其中,更新内嵌集合比较特别,它使用了集合元素的下标进行更新,$就是表示当前要更新的元素的下标!

感谢阅读!

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. Python读取文件时输入文件绝对路径报错

    问题描述 读取本地文件,输入绝对路径时出错,显示数据被截断. 最开始以为是转译错误,因为eclipse会自动把\变成\\, pycharm这里没有,就手动改一下.结果还是不行. 根本原因 文件名出错了 ...

  2. bolt_storage.go

    package, * time.Second})     if err != nil {         return nil, err     }     err = db.Update(func( ...

  3. bzoj 2500 幸福的道路 树上直径+set

    首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...

  4. BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理

    BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理 题意: ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种 ...

  5. BZOJ_2792_[Poi2012]Well_二分答案

    BZOJ_2792_[Poi2012]Well_二分答案 Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某 ...

  6. AngularJs parent index

    AngualrJs ng-repeat使用 $parent.$index 当时用ng-repeat的时候在其子原属中可以使用$parent.$index获取父级下标,当没有没有多一级的ng-if,一般 ...

  7. C# WinForm ShowInTaskbar Api Version

    using System; using System.Runtime.InteropServices; namespace x { unsafe class NativeWindow { /* * W ...

  8. 测试修改hosts文件py小工具

    import sys,osparm_list=sys.argvHOST_PATH=r'C:\liuliang\flask_test\test\hosts'class HostFile(object): ...

  9. 【SAP业务模式】之STO(二):系统配置

    本篇博文开始讲述STO业务模式的配置! 一.定义发货工厂的装运数据: 目录:SPRO-物料管理-采购-采购订单-设置库存调拨订单-定义工厂的装运数据 定义发货工厂的装运数据: 为收货工厂分配客户代码: ...

  10. Netty基础系列(1) --linux网路I/O模型

    引言 我一直认为对于java的学习,掌握基础的性价比要远远高于使用框架,而基础知识中对于网络相关知识的掌握也是重中之重.对于一个java程序来说,无论是工作中还是面试,对于Netty的掌握都是及其重要 ...