MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So verwenden Sie die Aggregationsabfrage mit MongoItemReader im Spring-Batch

Erweitern Sie MongoItemReader und stellen Sie Ihre eigene Implementierung für die Methode doPageRead() bereit. Auf diese Weise haben Sie volle Paginierungsunterstützung und das Lesen von Dokumenten ist Teil eines Schritts.

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

}
}

Und andere Getter und Setter und andere Methoden. Schauen Sie sich einfach den Quellcode für MongoItemReader an hier . Ich habe auch die Abfrageunterstützung entfernt. Sie können das auch in der gleichen Methode haben, kopieren Sie es einfach aus MongoItemReader und fügen Sie es ein. Dasselbe gilt für Sortieren.

Und in der Klasse, in der Sie einen Reader haben, würden Sie so etwas tun:

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;
}