web-dev-qa-db-fra.com

Pagination avec mongoTemplate

J'ai une requête avec Pageable:

Query query = new Query().with(new PageRequests(page, size))

Comment puis-je l'exécuter avec MongoTemplate? Je ne vois pas une seule méthode renvoyer Page<T>.

19
Marcin Wisnicki

MongoTemplate n'a pas de méthode pour renvoyer Page. Les méthodes find() renvoient un List ordinaire.

with(new PageRequests(page, size) est utilisé en interne pour ajuster skip et limit avec une requête MongoDB (procédée par une requête count je pense)

Page peut être utilisé conjointement avec référentiels MongoDB qui est un cas spécialisé des référentiels de données Spring.

Ainsi, vous devrez utiliser le Page findAll(Pageable pageable) de MongoRepository pour les résultats paginés (en fait hérité de PagingAndSortingRepository).

13
Ori Dar

Il est vrai que MongoTemplate n'a pas findXXX avec Pageables.

Mais vous pouvez utiliser le Spring Repository PageableExecutionUtils pour cela.

Dans votre exemple, cela ressemblerait à ceci:

Pageable pageable = new PageRequests(page, size);
Query query = new Query().with(pageable);
List<XXX> list = mongoTemplate.find(query, XXX.class);
return PageableExecutionUtils.getPage(
                       list, 
                       pageable, 
                       () -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), XXX.class));

Comme dans le référentiel de données Spring original, le PageableExecutionUtils fera une demande de décompte et l'enveloppera dans un joli Page pour vous.

Ici vous pouvez voir que le printemps fait de même.

40
d0x

Basé sur la réponse de d0x et en regardant le code ressort . J'utilise cette variation qui fonctionne sur la dépendance Spring-Boot-Starter-Data-Mongodb sans avoir besoin d'ajouter des données communes Spring.

@Autowired
private MongoOperations mongoOperations;

@Override
public Page<YourObjectType> searchCustom(Pageable pageable) {
    Query query = new Query().with(pageable);
    // Build your query here

    List<YourObjectType> list = mongoOperations.find(query, YourObjectType.class);
    long count = mongoOperations.count(query, YourObjectType.class);
    Page<YourObjectType> resultPage = new PageImpl<YourObjectType>(list , pageable, count);
    return resultPage;
}
13
Razzlero
return type Mono<Page<Myobject>>...

return this.myobjectRepository.count()
        .flatMap(ptiCount -> {
          return this.myobjectRepository.findAll(pageable.getSort())
            .buffer(pageable.getPageSize(),(pageable.getPageNumber() + 1))
            .elementAt(pageable.getPageNumber(), new ArrayList<>())
            .map(ptis -> new PageImpl<Myobject>(ptis, pageable, ptiCount));
        });
0
velastiqui