我们在使用mongo DB数据库进行查询的时候,只使用MongoRepository进行查询,实现部分复杂的查询的时候会变得有些吃力。我们可以使用MongoTemplate实现比较复杂的查询。
首先需要配置maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置简单的application.properties文件
#uri: mongodb://username:password@ip:port/admin
spring.data.mongodb.uri=mongodb://yin:yin@localhost:27017
spring.data.mongodb.database=xc_cms
这是事先准备好的数据

下面对部分常用命令进行演示
@Autowired
MongoTemplate mongoTemplate;
@Override
public JsonVO testMongoFind() {
JsonVO jsonVO = new JsonVO(200, "success");
//返回只返回某些字段
Query query4 = new Query();
query4.fields().include("valueInt").include("valueInt2");
List<MongoTestEntity> entityList2 = mongoTemplate.find(query4, MongoTestEntity.class, "mongoTest");
System.out.println(entityList2);
//返回mongno不为null 或者 ""
Query query5 = new Query();
List<String> testLst = new ArrayList<>();
testLst.add("");
testLst.add(null);
query5.addCriteria(Criteria.where("valueStr").nin(testLst));
List<MongoTestEntity> entityList3 = mongoTemplate.find(query5, MongoTestEntity.class, "mongoTest");
System.out.println(entityList3);
//模糊查询
Query query6 = new Query();
//如果有特殊符号使用转义符
query6.addCriteria(Criteria.where("valueStr").regex(".*?" +"hao"+ ".*"));
List<MongoTestEntity> entityList4 = mongoTemplate.find(query6, MongoTestEntity.class, "mongoTest");
System.out.println(entityList4);
//分页排序
int pageNum = 2;
int pageSize = 3;
int start = (pageNum - 1) * pageSize;
Query query = new Query();
query.with(Sort.by(Sort.Direction.DESC, "valueInt"));
query.skip(start).limit(pageSize);
List<MongoTestEntity> entityList = mongoTemplate.find(query, MongoTestEntity.class, "mongoTest");
//计算总数
long mongoTestNum = mongoTemplate.count(query, MongoTestEntity.class, "mongoTest");
System.out.println(mongoTestNum);
//复杂sql的转化(in/and/or/大于/小于/等于)
//select * from mongoTest where valueStr in ("nihao","dajiahao")
// and valueInt>=2 and (valueInt2 =15 or time>= (now -interval 5 day))
Query query2 = new Query();
Criteria criteria =new Criteria();
List<String> valueStrParam = new ArrayList<>();
valueStrParam.add("nihao");
valueStrParam.add("dajiahao");
criteria.and("valueStr").in(valueStrParam).andOperator(Criteria.where("valueInt").gte(2)).
orOperator(Criteria.where("valueInt2").is(15), Criteria.where("time")
.gte(LocalDateTime.now().minus(5, ChronoUnit.DAYS)));
query2.addCriteria(criteria);
List<MongoTestEntity> entityList1 = mongoTemplate.find(query2, MongoTestEntity.class, "mongoTest");
System.out.println(entityList1);
//进行聚合操作 select count(valueStr) as count,valueStr as valueStr ,sum(valueInt2) as valueInt2 from mongoTest group by valueStr
Aggregation aggregation = Aggregation.newAggregation(Aggregation.group("valueStr").count().as("count").
first("valueStr").as("valueStr").sum("valueInt2").as("valueInt2"))
///Aggregation.newAggregationOptions().allowDiskUse(true)是用来解除mongodb 查询数据默认占用最大内存的(默认100M).不然会抛出异常:
.withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
AggregationResults<AggregationVO> aggregateFrist = mongoTemplate.aggregate(aggregation, "mongoTest", AggregationVO.class);
List<AggregationVO> mappedResults = aggregateFrist.getMappedResults();
System.out.println(mappedResults);
jsonVO.setData(entityList);
return jsonVO;
}
用mongoTemplate做更改
@Override
public JsonVO upsetMongoTest(MongoTestEntity mongoTestEntity){
String result = "";
String str = mongoTestEntity.getValueStr();
Query query = new Query();
query.addCriteria(Criteria.where("valueStr").is(str));
org.bson.Document document = new org.bson.Document();
mongoTemplate.getConverter().write(mongoTestEntity,document);
Update update = Update.fromDocument(document);
UpdateResult upsert = mongoTemplate.upsert(query, update, MongoTestEntity.class, "mongoTest2");
if (upsert.getMatchedCount() > 0) {
System.out.println("--------------:数据更改");
result = "数据更改";
}else {
System.out.println("-----------:数据插入");
result = "数据插入";
}
return new JsonVO(200, "success", result);
}
采用另外一种方式来查询更改
/**
* 测试查询更改
*/
@Override
public void testUpdate() {
//查询
int pageNum = 1;
int pageSize = 10;
Sort sort = Sort.by(Sort.Direction.DESC, "valueInt");
PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize, sort);
Query query = new Query();
query.addCriteria(createCriteria());
List<MongoTestEntity> mongoTest = mongoTemplate.find(query.with(pageRequest), MongoTestEntity.class, "mongoTest");
System.out.println(mongoTest);
//更改
Update update = new Update();
update.set("valueStr2", "haohao");
update.set("time", LocalDateTime.now());
Query query2 = new Query();
query2.addCriteria(createCriteria());
mongoTemplate.updateMulti(query2, update, "mongoTest");
}
/**
* 添加条件
* @return
*/
private Criteria createCriteria(){
Criteria criteria = new Criteria();
ArrayList<String> valueStrLst = new ArrayList<>();
valueStrLst.add("nihao");
valueStrLst.add("wohao");
criteria.and("valueStr").in(valueStrLst);
criteria.and("valueStr2").is("wohao");
return criteria;
}
附上使用的vo类
@Data
public class MongoTestEntity {
@Id
private String id;
private Integer valueInt;
private Integer valueInt2;
private String valueStr;
private LocalDateTime time;
}
@Data
public class AggregationVO {
private String valueStr;
private Integer count;
private Integer valueInt2;
}
附上使用插入数据的代码
@Override
public JsonVO insertData(){
JsonVO jsonVO = new JsonVO(200, "success");
List<MongoTestEntity> entityList = new ArrayList<>();
MongoTestEntity mongoTestEntity = new MongoTestEntity();
mongoTestEntity.setValueInt(1);
mongoTestEntity.setValueInt2(11);
mongoTestEntity.setValueStr("nihao");
mongoTestEntity.setTime( LocalDateTime.now().minus(10, ChronoUnit.HOURS));
entityList.add(mongoTestEntity);
MongoTestEntity mongoTestEntity2 = new MongoTestEntity();
mongoTestEntity2.setValueInt(1);
mongoTestEntity2.setValueInt2(15);
mongoTestEntity2.setValueStr("wohao");
mongoTestEntity2.setTime( LocalDateTime.now().minus(15, ChronoUnit.HOURS));
entityList.add(mongoTestEntity2);
MongoTestEntity mongoTestEntity3 = new MongoTestEntity();
mongoTestEntity3.setValueInt(5);
mongoTestEntity3.setValueInt2(15);
mongoTestEntity3.setValueStr("dajiahao");
mongoTestEntity3.setTime( LocalDateTime.now().minus(5, ChronoUnit.HOURS));
entityList.add(mongoTestEntity3);
MongoTestEntity mongoTestEntity4 = new MongoTestEntity();
mongoTestEntity4.setValueInt(5);
mongoTestEntity4.setValueInt2(15);
mongoTestEntity4.setTime( LocalDateTime.now().minus(5, ChronoUnit.HOURS));
entityList.add(mongoTestEntity4);
mongoTemplate.insert(entityList, "mongoTest");
return jsonVO;
}
版权声明:本文为fajing_feiyue原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。