Java 通过Spring Boot Rest API查询mongo db集合,以分页格式返回结果

Java 通过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

Mongo中存在一个具有几个属性的集合。每当引擎中发生任何事务时,都会保存该消息。我需要一个API,使用户能够通过以下属性的一个或多个组合来搜索AnaysisJob: •开始 •开始时,我们需要一个“from”和“to”,我们正在使用一个between子句进行搜索。 •地位

用户可以使用单个属性或上述属性的组合进行搜索。如果使用组合,则必须使用“和”

不要忘记,它还必须支持分页

以下是课程:

AnalysisJobSearchCriteria.java

@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();

}