zoukankan      html  css  js  c++  java
  • mongo 对数组元素及内嵌文档进行增删改查操作

    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);
        }
  • 相关阅读:
    [LeetCode#252] Meeting Rooms
    [LeetCode#247] Strobogrammatic Number II
    [LeetCode#265] Paint House II
    [LeetCode#256] Paint House
    [LeetCode#279] Perfect Squares
    [LeetCode#259] 3Sum Smaller
    [LeetCode#261] Graph Valid Tree
    [LeetCode#271] Encode and Decode Strings
    xfsdump的选项-L和-M
    Centos7 报错welcome to emergency mode
  • 原文地址:https://www.cnblogs.com/lshan/p/15660230.html
Copyright © 2011-2022 走看看