淘先锋技术网

首页 1 2 3 4 5 6 7

一、前言

前面我们完成了SpringBoot在项目上对MongoDB的整合,包括

  • 引入依赖
  • 本地docker环境
  • 处理用户权限

下面将要完成一些增删改查的完整实例,方便以后直接调用。

二、MongoTemplate

增删改查是基于用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/" target="_blank" rel="external nofollow" >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/" target="_blank" rel="external nofollow" >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/" target="_blank" rel="external nofollow" >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/" target="_blank" rel="external nofollow" >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/" target="_blank" rel="external nofollow" >MongoDB Query operator: $type</a>
	 */
	public Criteria type(int typeNumber) {
		criteria.put("$type", typeNumber);
		return this;
	}

我们可以看到,Criteria对MongoDB中的操作进行了封装,并提供了重构方法,保证各种形式的传参。

下面的实例中,只要是涉及到查询,就是使用Criteria对条件进行拼接,然后通过new Query(criteria)作为参数传进去。

三、增删改查

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");

四、总结

熟练掌握MongoDB的增删改查,需要在熟悉原生查询语法的基础上,对Criteria的方法比较熟悉,其他的都可以通过查源码的方式理解。

五、源码地址

本文源码同步更新在gitcode中,地址为 SpringBootWithMongoDB · master · 小雨青年 / Java Demo · GitCode