用mongoTemplate分页

时间:2015-03-13 11:00:34

标签: java spring-data spring-data-mongodb

我有一个可查询的查询:

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

如何使用MongoTemplate执行它?我没有看到返回Page<T>的单一方法。

6 个答案:

答案 0 :(得分:27)

MongoTemplate没有Pageables findXXX这是真的。

但是你可以使用Spring Repository 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, XXX.class));

与最初的Spring Data Repository一样,PageableExecutionUtils将执行一个计数请求并将其包装成一个很好的Page

Here你可以看到春天也在做同样的事情。

答案 1 :(得分:10)

MongoTemplate没有返回Page的方法。 find()方法返回普通的List

内部使用

with(new PageRequests(page, size)通过MongoDB查询调整skiplimit(我认为是计数查询)

Page可以与MongoDB repositories结合使用,{{3}}是Spring数据存储库的一个特例。

因此,您必须使用MongoRepository的{​​{1}}来获取分页结果(实际上是从Page findAll(Pageable pageable)继承而来的)。

答案 2 :(得分:8)

根据d0x的回答并查看spring code。我正在使用这种变体,它不依赖于spring-boot-starter-data-mongodb依赖,而无需添加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;
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

默认情况下,spring mongo 模板没有按页查找的方法。它搜索并返回整个记录列表。我试过了,它有效:

Pageable pageable = new PageRequests(0, 10);                              
Query query = new Query(criteria); 
query.with(pageable);   
List<User> lusers = mt.find(query, User.class);   
Page<User> pu = new PageImpl<>(lusers, pageable, mongoTemplate.count(newQuery(criteria), User.class));

答案 5 :(得分:0)

此处提供的解决方案均不适用于我自己的案例。 我尝试在下面的一篇中等文章中使用此解决方案,但它从未返回分页结果,但返回了所有不是我所期望的结果

return PageableExecutionUtils.getPage(
        mongoTemplate.find(query, ClassName.class),
        pageable,
        () -> mongoTemplate.count(query.skip(0).limit(0), ClassName.class)
);

所以我找到了一种更好的方法来解决这个问题,并且在我的情况下有效:

return PageableExecutionUtils.getPage(
            mongoTemplate.find(query.with(pageable), ClassName.class),
            pageable,
            () -> mongoTemplate.count(query, ClassName.class));