天天看點

【SpringBoot】SpringBoot整合MongoDB使用MongoTemplate進行增删改查執行個體

一、前言

前面我們完成了SpringBoot在項目上對MongoDB的整合,包括

  • 引入依賴
  • 本地docker環境
  • 處理使用者權限

下面将要完成一些增删改查的完整執行個體,友善以後直接調用。

二、MongoTemplate

增删改查是基于用MongoTemplate的調用,如下方式進行引入

import org.springframework.data.mongodb.core.MongoTemplate;
           

其中,Criteria的作用是組合查詢條件,源碼位置如下。

org/springframework/data/mongodb/core/query/Criteria.java
           

我們截取幾個方法,看下他是如何對條件進行拼接的。

/**
	 * Creates a criterion using the {@literal $lt} operator.
	 *
	 * @param value must not be {@literal null}.
	 * @return this.
	 * @see <a href="https://docs.mongodb.com/manual/reference/operator/query/lt/">MongoDB Query operator: $lt</a>
	 */
	public Criteria lt(Object value) {
		criteria.put("$lt", value);
		return this;
	}

	/**
	 * Creates a criterion using the {@literal $lte} operator.
	 *
	 * @param value must not be {@literal null}.
	 * @return this.
	 * @see <a href="https://docs.mongodb.com/manual/reference/operator/query/lte/">MongoDB Query operator: $lte</a>
	 */
	public Criteria lte(Object value) {
		criteria.put("$lte", value);
		return this;
	}

           
/**
	 * Creates a criterion using the {@literal $size} operator.
	 *
	 * @param size
	 * @return this.
	 * @see <a href="https://docs.mongodb.com/manual/reference/operator/query/size/">MongoDB Query operator: $size</a>
	 */
	public Criteria size(int size) {
		criteria.put("$size", size);
		return this;
	}

	/**
	 * Creates a criterion using the {@literal $exists} operator.
	 *
	 * @param value
	 * @return this.
	 * @see <a href="https://docs.mongodb.com/manual/reference/operator/query/exists/">MongoDB Query operator: $exists</a>
	 */
	public Criteria exists(boolean value) {
		criteria.put("$exists", value);
		return this;
	}

	/**
	 * Creates a criterion using the {@literal $type} operator.
	 *
	 * @param typeNumber
	 * @return this.
	 * @see <a href="https://docs.mongodb.com/manual/reference/operator/query/type/">MongoDB Query operator: $type</a>
	 */
	public Criteria type(int typeNumber) {
		criteria.put("$type", typeNumber);
		return this;
	}
           

我們可以看到,Criteria對MongoDB中的操作進行了封裝,并提供了重構方法,保證各種形式的傳參。

三、增删改查

1.新增

Cat cat = new Cat();
        cat.setName("糖果");
        cat.setAge(3);
        cat.setLikeCount(100);
        mongoTemplate.insert(cat);
           

2.删除

String id = "620a27c3db5ca321f4cc5754";
        Criteria criteria = (new Criteria(entityClass.getDeclaredField("id").getName())).is(id);
        //根據條件删除
        Cat cat = mongoTemplate.findAndRemove(new Query(criteria), entityClass);
        System.out.println(cat);

        //直接删除
        Cat cat2 = mongoTemplate.findById("620a27c3db5ca321f4cc5754", entityClass);
        assert cat2 != null;
        DeleteResult result = mongoTemplate.remove(cat2);
        System.out.println(result);

        //findAllAndRemove 和 findAndRemove 的差別在于,前者删除全部比對的資料,後者隻删除一個
           

3. 查找

//查詢全部
        List<Cat> cats = mongoTemplate.findAll(entityClass);
        System.out.println(cats);

        //根據條件查詢
        Criteria criteria = (new Criteria(entityClass.getDeclaredField("likeCount").getName())).is(cats.get(0).getLikeCount());
        List<Cat> cats2 = mongoTemplate.find(new Query(criteria), entityClass);
        System.out.println(cats2);

        //根據ID查詢
        Cat cat = mongoTemplate.findById(cats.get(1).getId(), entityClass);
        System.out.println(cat);

        //查詢單條記錄
        Criteria criteria2 = (new Criteria(entityClass.getDeclaredField("name").getName())).is(cats.get(0).getName());
        Cat cat2 = mongoTemplate.findOne(new Query(criteria2), entityClass);
        System.out.println(cat2);
           

4. 更新

String id = "620b1b46d6e42202392f5653";
        Criteria criteria = (new Criteria(entityClass.getDeclaredField("id").getName())).is(id);

        Update update = new Update();
        update.set(entityClass.getDeclaredField("name").getName(), "炸醬233");
        update.inc("likeCount");

        //單條更新
        UpdateResult updateResult = mongoTemplate.updateFirst(new Query(criteria), update, entityClass);
        System.out.println(updateResult);

        Criteria criteria2 = (new Criteria(entityClass.getDeclaredField("age").getName())).is(3);

        Update update2 = new Update();
        update2.set(entityClass.getDeclaredField("name").getName(), "炸醬");
        update2.inc("age");

        //批量更新
        UpdateResult updateResult2 = mongoTemplate.updateMulti(new Query(criteria2), update2, entityClass);
        System.out.println(updateResult2);
           

5. 其他

//擷取集合名稱
        String collectionName =  mongoTemplate.getCollectionName(entityClass);
        System.out.println(collectionName);

        //判斷集合是不是存在 false
        boolean check = mongoTemplate.collectionExists("dog");
        System.out.println(check);

        //判斷集合是不是存在 true
        boolean checkCat = mongoTemplate.collectionExists("cat");
        System.out.println(checkCat);

        //建立集合
        mongoTemplate.createCollection("bug2");

        //删除集合
        mongoTemplate.dropCollection("bug2");
           

四、總結

五、源碼位址