springboot 2.2.5
比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下:
{ "_id" : "195861", "tags" : [ { "tagId" : NumberLong(766), "optDate" : ISODate("2021-08-12T15:21:02.930Z"), "enable" : true }, { "tagId" : NumberLong(778), "optDate" : ISODate("2021-08-12T15:21:02.930Z"), "enable" : true } ] }
下面对这个文档中的tag进行增删该查操作,这里用到了spring mongodb 里面的MongoTemplate类。我这里把tags里的内嵌文档抽象成了Tag类。代码删除和修改本身就包含查询方法,所以没写查询方法
@Autowired protected MongoTemplate mongoTemplate; /** **给tags数组添加一个元素 */ public void addTag(String id, Long tagId) { Tag tag = new Tag(tagId); tag.setOptDate(new Date()); tag.setEnable(true); Query query = Query.query(Criteria.where("_id").is(id)); Update update = new Update(); update.addToSet("tags", tag); //update.push("members", menberTO); // push 新增元素,允许出现重复的数据 mongoTemplate.upsert(query, update, User.class); } /** **修改tags数组中内嵌文档指定一个元素的值 */ public Response<Integer> updateTag(String id, Long tagId) { try { Query query = Query.query(Criteria.where("_id").is(id).and("tags.tagId").is(tagId)); Update update = new Update(); update.set("tags.$.enable", false); mongoTemplate.updateFirst(query, update, User.class); } catch (Exception e) { return new Response<Integer>(0); } return new Response<Integer>(1); } /** **删除tags数组中指定的内嵌文档 */ public Response<Integer> removeTag(String id, Long tagId) { try { Query query = Query.query(Criteria.where("_id").is(id).and("tags.tagId").is(tagId)); Update update = new Update(); update.unset("tags.$");//此处仅仅是把该元素置null //Update update1 = new Update().pull("tags", value);//可以用pull删除,value,是数组的对象, //可以考虑做两次upadte,先unset("tags.$"),然后.pull("tags", null); mongoTemplate.updateFirst(query, update, User.class); } catch (Exception e) { return new Response<Integer>(0); } return new Response<Integer>(1); }
分类:
MongoDB
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2019-12-08 python excel (pandas)
2019-12-08 python数据分析之 pandas
2019-12-08 python 数据清洗之数据合并、转换、过滤、排序(转)