1. 程式人生 > >springboot~mongo內嵌集合的操作

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

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

感謝閱讀!