一、前言
前面我们完成了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中的操作进行了封装,并提供了重构方法,保证各种形式的传参。
下面的实例中,只要是涉及到查询,就是使用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
的方法比较熟悉,其他的都可以通过查源码的方式理解。