文档章节

springboot~mongo内嵌集合的操作

o
 osc_z1hvg4cu
发布于 2018/04/24 14:00
字数 493
阅读 9
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

对于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);
  }

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

感谢阅读!

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
补习系列(17)-springboot mongodb 内嵌数据库

目录 简介 一、使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二、使用Fongo A. 引入框架 B. 准备测试类 C.业务测试 参考文档 小结 简介 前面的文章...

osc_p9lyobzy
2019/09/04
1
0
补习系列(17)-springboot mongodb 内嵌数据库

[TOC] 简介 前面的文章中,我们介绍了如何在SpringBoot 中使用MongoDB的一些常用技巧。那么,与使用其他数据库如 MySQL 一样,我们应该怎么来做MongoDB的单元测试呢? 使用内嵌数据库的好处是...

osc_5dotef4h
2019/03/02
7
0
补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】

目录 简介 一、使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二、使用Fongo A. 引入框架 B. 准备测试类 C.业务测试 参考文档 小结 简介 前面的文章...

osc_resa95yg
2019/12/10
4
0
Springboot整合MongoDB的Docker开发,其它应用也类似

1 前言 是容器开发的事实标准,而是微服务常用框架,二者必然是会走到一起的。本文将讲解如何开发项目,把它做成镜像,并运行起来。 2 把Springboot打包成Docker镜像 的开发非常简单,本次使...

南瓜慢说
07/05
8
0
SpringBoot整合MongoDB

本节使用SpringBoot 2.1.9.RELEASE,示例源码在https://github.com/laolunsi/spring-boot-examples SpringBoot可以非常方便地引入和操作MongoDB。本节分两部分,记录个人学习SpringBoot使用M...

osc_0i27cy0p
04/16
9
0

没有更多内容

加载失败,请刷新页面

加载更多

未捕获ReferenceError:未定义$? - Uncaught ReferenceError: $ is not defined?

问题: How come this code throws an 此代码如何引发 Uncaught ReferenceError: $ is not defined 未捕获的ReferenceError:未定义$ when it was OK before? 以前什么时候可以? $(document......

javail
18分钟前
12
0
263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
41分钟前
46
0
HCIA_ARP01

ARP(地址解析协议) eNSP 常用路由器:AR2220 常用交换机:S5700、S3700 常用终端:PC、MCS(主播服务器) 设备连线:Copper(以太网用到的双绞线)、Serial(串口线,2SA接口)、Auto(自动连...

创业789
44分钟前
13
0
如何在Rails 4中使用问题 - How to use concerns in Rails 4

问题: The default Rails 4 project generator now creates the directory "concerns" under controllers and models. 默认的Rails 4项目生成器现在在控制器和模型下创建目录“Concer”。 ......

fyin1314
48分钟前
19
0
【LeetCode】 57 括号生成

题目: 解题思路: https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/ 代码: import java.util.ArrayList;import java.util.List;publ......

JaneRoad
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部