• 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);
      }

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

    感谢阅读!

  • 相关阅读:
    团队冲刺二(6)
    团队冲刺二(5)
    JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
    解决ADB server didn't ACK问题,连上手机问题
    ADB server didn't ACK
    android错误
    Andy
    在Eclipse下搭建Android开发环境教程
    VM VirtualBox 安装 Android 4.3虚拟机完整教程
    电脑安装Android4.0虚拟机的做法
  • 原文地址:https://www.cnblogs.com/lori/p/8929855.html
Copyright © 2020-2023  润新知