一、前言
前面我们完成了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