Java 通过Spring Boot Rest API查询mongo db集合,以分页格式返回结果
Mongo中存在一个具有几个属性的集合。每当引擎中发生任何事务时,都会保存该消息。我需要一个API,使用户能够通过以下属性的一个或多个组合来搜索AnaysisJob: •开始 •开始时,我们需要一个“from”和“to”,我们正在使用一个between子句进行搜索。 •地位 用户可以使用单个属性或上述属性的组合进行搜索。如果使用组合,则必须使用“和” 不要忘记,它还必须支持分页 以下是课程: AnalysisJobSearchCriteria.javaJava 通过Spring Boot Rest API查询mongo db集合,以分页格式返回结果,java,mongodb,rest,spring-boot,mongotemplate,Java,Mongodb,Rest,Spring Boot,Mongotemplate,Mongo中存在一个具有几个属性的集合。每当引擎中发生任何事务时,都会保存该消息。我需要一个API,使用户能够通过以下属性的一个或多个组合来搜索AnaysisJob: •开始 •开始时,我们需要一个“from”和“to”,我们正在使用一个between子句进行搜索。 •地位 用户可以使用单个属性或上述属性的组合进行搜索。如果使用组合,则必须使用“和” 不要忘记,它还必须支持分页 以下是课程: AnalysisJobSearchCriteria.java @Data @Document publi
@Data
@Document
public class AnalysisJobSearchCriteria {
private Long startedAt = System.currentTimeMillis();
private String startedBy;
private AnalysisJobStatusType status;
}
AnalysisJobResource.java
@Slf4j
@Api(value = "Analysis Job Resource", tags = "CONNECTIONS")
@RestController
@RequestMapping("/api/v1")
public class AnalysisJobResource {
@Autowired
private AnalysisJobSearchService analysisJobSearchService;
@ApiOperation(value = "Analysis", response = Map.class)
@ApiResponses({
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 404, message = "Not found"),
@ApiResponse(code = 200, message = "OK")
})
@PostMapping(value = "/analysis-job", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> searchAnalysisJob(@RequestBody final AnalysisJobSearchCriteria analysisJobSearchCriteria) {
AggregationResults<AnalysisJobResource> analysisJob = analysisJobSearchService.searchAnalysisJobs(analysisJobSearchCriteria);
return new ResponseEntity<>(analysisJob, HttpStatus.OK);
}
}
AnalysisJobSearchService.java
@Service
public class AnalysisJobSearchService {
private final AnalysisJobCustomRepositoryImpl analysisJobCustomRepositoryImpl;
@Autowired
public AnalysisJobSearchService(final AnalysisJobCustomRepositoryImpl analysisJobCustomRepositoryImpl) {
this.analysisJobCustomRepositoryImpl = analysisJobCustomRepositoryImpl;
}
public AggregationResults<AnalysisJobResource> searchAnalysisJobs(AnalysisJobSearchCriteria analysisJobSearchCriteria) {
AggregationResults<AnalysisJobResource> analysisJob = analysisJobCustomRepositoryImpl.searchAnalysisJob(analysisJobSearchCriteria);
return analysisJob;
}
}
AnalysisJobCustomRepository.java
@SuppressWarnings("unchecked")
@Override
public AggregationResults<AnalysisJobResource> searchAnalysisJob(AnalysisJobSearchCriteria analysisJobSearchCriteria) {
MatchOperation salaryMatch = null;
if (!analysisJobSearchCriteria.getStatus().equals(null)) {
salaryMatch = Aggregation.match(new Criteria("status").is(analysisJobSearchCriteria.getStatus()));
}
Aggregation aggregation = Aggregation.newAggregation(salaryMatch);
AggregationResults<AnalysisJobResource> result = mongoTemplate.aggregate(
aggregation, "result", AnalysisJobResource.class);
return result;
}
这些是我的一些课程。我还有一个Connection类来建立与数据库的连接,该连接工作正常。只是我无法为我的场景提供一个查询和mongo模板
由于我还不熟悉将Mongo与Spring Boot结合使用,因此非常感谢您的帮助。另外,我认为如果服务返回List而不是AggregationResult,那会更好。但是如何用Java为Mongo创建查询让我感到困惑。对于分页,您可以使用org.springframework.data.domain.Page和org.springframework.data.domain.Pageable from Spring数据,如下文所述 对于搜索MongoDB数据库,也可以使用条件,因为它允许您向查询中动态添加AND/OR子句。您可以在下面找到一篇关于如何将标准与Spring数据和MongoDB结合使用的文章
您可以使用AggregationOperation处理此问题
private List<SearcheableEntity> searchSmth(CustomCriteria criteria){
List<AggregationOperation> operations = new ArrayList<>();
//it's simple way, better pattern is to create criteria builder,
//witch will create Criteria.class object from request params
operations.add(Aggregation.match(Criteria.where("name").is(criteria.getName());
//For pagination skip and limit methods can be used
operations.add(Aggregation.skip(criteria.getOffset() != null ? criteria.getOffset() : 0));
operations.add(Aggregation.limit(criteria.getLimit() != null ? criteria.getLimit() : Integer.MAX_VALUE));
return mongoTemplate
.aggregate(Aggregation.newAggregation(operations),
"Collection_name",
SearcheableEntity.class
).getMappedResults();
}
以你为例
SuppressWarnings("unchecked")
@Override
public List<AnalysisJobResource> searchAnalysisJob(AnalysisJobSearchCriteria criteria) {
List<AggregationOperation> operations = new ArrayList<>();
if (!criteria.getStatus() != null) {
operations.add(Aggregation.match(Criteria.where("status").is(criteria.getStatus())));
}
if(!criteria.getStartedAt().equals(null)){
operations.add(Aggregation.match(Criteria.where("time").gt(criteria.getStartedAt()));
}
return mongoTemplate.aggregate(
Aggregation.newAggregation(operations), "result", AnalysisJobResource.class).getMappedResults();
}
我在我的存储库中添加了以下方法:@Override public List searchAnalysisJobAnalysisJobSearchCriteria analysisJobSearchCriteria{Query Query Query=new Query;Query.addCriteriaCriteria.wherestatus.isanalysisJobSearchCriteria.getStatus;log.infoSingle Filter Only Query:{},query;List analysisJobResource=mongoTemplate.findquery,AnalysisJob.class;return analysisJobResource;}但是如何根据需要操作查询呢。这给了我一个基本的结果,其中有相等的状态标准。
SuppressWarnings("unchecked")
@Override
public List<AnalysisJobResource> searchAnalysisJob(AnalysisJobSearchCriteria criteria) {
List<AggregationOperation> operations = new ArrayList<>();
if (!criteria.getStatus() != null) {
operations.add(Aggregation.match(Criteria.where("status").is(criteria.getStatus())));
}
if(!criteria.getStartedAt().equals(null)){
operations.add(Aggregation.match(Criteria.where("time").gt(criteria.getStartedAt()));
}
return mongoTemplate.aggregate(
Aggregation.newAggregation(operations), "result", AnalysisJobResource.class).getMappedResults();
}