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); }
其中,更新内嵌集合比较特别,它使用了集合元素的下标进行更新,$就是表示当前要更新的元素的下标!
感谢阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.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删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住)