springboot~mongo內(nei)嵌集(ji)合(he)的(de)操(cao)作
對(dui)于mongodb的(de)內嵌對(dui)象的(de)各(ge)種操作大叔在(zai).net平臺時(shi)已經(jing)說(shuo)過(guo),同時(shi)大叔也自己封裝過(guo)mongo的(de)倉儲,使用也都很方便(bian),而在(zai)java springboot框架里(li)當(dang)然也有對(dui)應的(de)方法,下(xia)面主要(yao)說(shuo)一下(xia),希望(wang)對(dui)剛(gang)接觸mongodb的(de)同學(xue)有所幫助!
一 測試DEMO的數據結構
/** * 地址. */ @Data @NoArgsConstructor @AllArgsConstructor public class Address { /** * 編號. */ @Id private String id; /** * 省. */ private String province; /** * 市. */ private String city; /** * 區. */ private String district; /** * 狀態. */ private Status status; /** * 擴展(zhan). */ private List<AddressExtension> addressExtension; }
其中它有(you)一(yi)個內嵌的(de)集(ji)合(he)對象(xiang),addressExtension,我們添(tian)加了一(yi)些測試數(shu)據,如圖:
下面介(jie)紹幾種常用的數(shu)據操作:
/** * 獲取數據. * * @param province 省 * @param city 市(shi) * @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"); } /** * 更新字(zi)段. * * @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); } /** * 添加內(nei)嵌文檔中(zhong)的數據. * * @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如果數據已經存在(zai),則不做任何操作,而(er)push會(hui)插(cha)入一(yi)條一(yi)樣的(de)數據 update.addToSet("addressExtension", ext); mongoTemplate.upsert(query, update, Address.class); } /** * 更新內嵌文檔里某(mou)條元素 * * @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()); } /** * 刪(shan)除內(nei)嵌文檔中的(de)數據. * * @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); } /** * 刪(shan)除文(wen)檔. * * @param id . */ @Override public void delAddress(String id) { Query query = Query.query(Criteria.where("_id").is(id)); mongoTemplate.remove(query, Address.class); }
其中,更新內嵌集合比較(jiao)特別,它使用了集合元(yuan)素的(de)下(xia)標進行更新,$就是表(biao)示當前要更新的(de)元(yuan)素的(de)下(xia)標!
感謝閱讀!