用mongoTemplate分页

Mar*_*cki 17 java spring-data spring-data-mongodb

我有一个可查询的查询:

Query query = new Query().with(new PageRequests(page, size))
Run Code Online (Sandbox Code Playgroud)

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

d0x*_*d0x 34

确实,这与Pageables MongoTemplate没有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));
Run Code Online (Sandbox Code Playgroud)

就像在原始的Spring Data Repository中一样,它PageableExecutionUtils会执行一个count请求并将它包装成一个很好Page的.

在这里你可以看到春天也在做同样的事情.

  • 这很有趣,但是如果您的查询返回数十万或数百万行而不分页,那么当服务器尝试将所有这些文档读入内存时,这将使您的服务器瘫痪。使用聚合框架更好 (4认同)

Ori*_*Dar 13

MongoTemplate没有返回的方法Page.该find()方法返回一个普通的List.

with(new PageRequests(page, size)用于内部调整skiplimitMongoDB查询(我认为计数查询继续)

Page可以与MongoDB存储库一起使用,这是Spring数据存储库的一个特例.

因此,您必须使用MongoRepository's Page findAll(Pageable pageable)作为分页结果(实际上继承自PagingAndSortingRepository).


Raz*_*ero 12

根据d0x的答案并查看弹簧代码.我正在使用这种变体,它可以解决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;
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:为了获得正确的计数值 - 查询应该重置:跳过,限制值。计数调用应该是:“mongoOperations.count(query.skip(-1).limit(-1), YourObjectType.class)”。否则,它将返回错误的查询计数。 (2认同)