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

其中,更新內嵌集合比較特別,它使用了集合元素的下標進行更新,$就是表示當前要更新的元素的下標!

感謝閱讀!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM