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);
  }
复制代码

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

感谢阅读!

posted @   张占岭  阅读(4666)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2014-04-24 MVVM架构~使用boxy和knockoutjs实现编辑功能
2012-04-24 System.Web.Caching.Cache删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住)
点击右上角即可分享
微信分享提示