一、业务场景
公司业务框架中有需要用到MongoDB数据库进行数据的存储,前端需要在该框架下进行多条件的动态组合查询。如果在之前mysql中该问题非常好实现,那么我们使用的是MongoDB,又该如何实现呢?
二、实现前提
1、引入MongoDB的依赖
<!--mongdb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、监听器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoConverter;
/**
* @Title: TODO
* @ClassName ApplicationReadyListener
* @Date 2022/11/8 15:04
* @Version 1.0
*/
@Configuration
public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
MongoTemplate oneMongoTemplate;
private static final String TYPEKEY = "_class";
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
MongoConverter converter = oneMongoTemplate.getConverter();
if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
}
}
}
3、实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;
/**
* 班次表
*
* @date 2022-09-05 16:01:09
*/
@Data
@Document(collection = "calendar_info")
public class CalendarEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private String prodLine;
private String planName;
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
private Date calendarTime;
private String week;
private String workTime;
}
三、简单实现代码
/**
* 根据姓名和产线查询
* @param
* @return
*/
@ResponseBody
@ApiOperation(value = "根据姓名和产线查询")
@PostMapping("/getPlanNameLine")
public R getPlanNameLine(@RequestBody Map<String, Object> params) {
//MongoDB多条件动态查询
String planName =(String) params.get("planName");
String prodLine =(String) params.get("prodLine");
Query query = new Query();
if (!StringUtils.isEmpty(planName)) {
Criteria planNameCriteria = Criteria.where("planName").is(planName);
query.addCriteria(planNameCriteria);
}
if (!StringUtils.isEmpty(prodLine)) {
Criteria prodLineCriteria = Criteria.where("prodLine").is(prodLine);
query.addCriteria(prodLineCriteria);
}
List<CalendarEntity> allList = mongoTemplate.find(query, CalendarEntity.class);
return R.ok().put("data",allList);
}