web-dev-qa-db-ja.com

mongoTemplateによるページ分割

Pageableを使用したクエリがあります。

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

MongoTemplateでどのように実行できますか? Page<T>を返す単一のメソッドがありません。

19
Marcin Wisnicki

MongoTemplateには、Pageを返すメソッドがありません。 find()メソッドは通常のListを返します。

with(new PageRequests(page, size)は、MongoDBクエリを使用してskipおよびlimitを調整するために内部的に使用されます(カウントクエリによって処理されると思います)

Pageは、Springデータリポジトリの特殊なケースである MongoDB repositories と組み合わせて使用​​できます。

したがって、ページ付けされた結果(実際にはMongoRepositoryから継承)にはPagingAndSortingRepositoryPage findAll(Pageable pageable)を使用する必要があります。

13
Ori Dar

MongoTemplateにPageablesのあるfindXXXがないことは事実です。

ただし、SpringリポジトリPageableExecutionUtilsを使用できます。

あなたの例では次のようになります:

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

元のSpring Data Repositoryと同様に、PageableExecutionUtilsはカウントリクエストを実行し、Nice Pageにラップします。

ここ 春も同じように動いていることがわかります。

40
d0x

D0xの回答に基づいて 春のコード を確認します。私はこのバリエーションを使用しています。このバリエーションは、spring-data-commonを追加する必要なしに、spring-boot-starter-data-mongodb依存関係を解消します。

@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