如何在 Spring Batch 中使用 MongoItemReader 聚合查询

Sha*_*ank 7 java mongodb spring-batch

需求发生了一些变化,我必须在 setQuery() 中使用聚合查询而不是基本查询。这可能吗?请建议我该怎么做?我的聚合查询已准备就绪,但不确定如何在 Spring Batch 中使用它

public ItemReader<ProfileCollection> searchMongoItemReader() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

        MongoItemReader<MyCollection> mongoItemReader = new MongoItemReader<>();
        mongoItemReader.setTemplate(myMongoTemplate);
        mongoItemReader.setCollection(myMongoCollection);

        mongoItemReader.setQuery(" Some Simple Query - Basic");

        mongoItemReader.setTargetType(MyCollection.class);
        Map<String, Sort.Direction> sort = new HashMap<>();
        sort.put("field4", Sort.Direction.ASC);
        mongoItemReader.setSort(sort);
        return mongoItemReader;

    }
Run Code Online (Sandbox Code Playgroud)

Far*_*raz 5

扩展 MongoItemReader 并为方法 doPageRead() 提供您自己的实现。这样您将获得完整的分页支持,并且文档的阅读将成为步骤的一部分。

public class CustomMongoItemReader<T, O> extends MongoItemReader<T> {
private MongoTemplate template;
private Class<? extends T> inputType;
private Class<O> outputType
private MatchOperation match;
private ProjectionOperation projection;
private String collection;

@Override
protected Iterator<T> doPageRead() {
    Pageable page = PageRequest.of(page, pageSize) //page and page size are coming from the class that MongoItemReader extends
    Aggregation agg = newAggregation(match, projection, skip(page.getPageNumber() * page.getPageSize()), limit(page.getPageSize()));
    return (Iterator<T>) template.aggregate(agg, collection, outputType).iterator();

}
}
Run Code Online (Sandbox Code Playgroud)

以及其他 getter 和 setter 等方法。只需在此处查看 MongoItemReader 的源代码即可。我还从中删除了查询支持。您也可以使用相同的方法,只需从 MongoItemReader 复制粘贴即可。与排序相同。

在有读者的课堂上,你会做类似的事情:

public MongoItemReader<T> reader() {
    CustomMongoItemReader reader = new CustomMongoItemReader();
    reader.setTemplate(mongoTemplate);
    reader.setName("abc");
    reader.setTargetType(input.class);
    reader.setOutputType(output.class);
    reader.setCollection(myMongoCollection);
    reader.setMatch(Aggregation.match(new Criteria()....)));
    reader.setProjection(Aggregation.project("..","..");
    return reader;
}
Run Code Online (Sandbox Code Playgroud)