我有一个可查询的查询:
Query query = new Query().with(new PageRequests(page, size))
如何使用MongoTemplate执行它?我没有看到返回Page<T>
的单一方法。
答案 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查询调整skip
和limit
(我认为是计数查询)
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));