MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment utiliser la requête d'agrégation avec MongoItemReader dans le lot de printemps

étendez MongoItemReader et fournissez votre propre implémentation pour la méthode doPageRead(). De cette façon, vous aurez un support complet de la pagination et cette lecture des documents fera partie d'une étape.

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

}
}

Et d'autres getter et setters et d'autres méthodes. Jetez un œil au code source de MongoItemReader ici .J'ai également supprimé le support de Query. Vous pouvez également l'avoir dans la même méthode, copiez-le simplement à partir de MongoItemReader. Idem avec Trier.

Et dans la classe où vous avez un lecteur, vous feriez quelque chose comme :

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