MongoDB多条件动态查询

一、业务场景

公司业务框架中有需要用到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);
    }

猜你喜欢

转载自blog.csdn.net/whc888666/article/details/127805106