如何使用graphql spqr,java,mongo创建分页查询?
下面是查询的外观:
allUsers(first : int, last :int, after : String, before : String(
No Spring
如果希望 SPQR 自动将结果映射为中继页,请确保从方法返回Page<>
。所以像这样:
public Page<User> allUsers(int first, int last, String after, String before) {
List<User> users = queryMongo(...); //however you query Mongo
return translateListToPage(users); //get a Page instance somehow, see below
}
我不知道您是否可以在 Mongo 中进行真正的基于游标的分页(您给它最后一个看到的游标并要求下一批项目(,但如果不是,您可以随时将其转换为简单的基于偏移量的分页或使用任何字段的值您可以排序作为光标。
请参阅我的回答 此处 了解如何实现这些方法。它描述了一个适用于关系数据库的解决方案,但逻辑是相同的。例如,您使用cursor.skip
和cursor.limit
而不是SQL的LIMIT
和OFFSET
。
简而言之,您可以执行以下操作:
public Page<User> allUsers(int first, String after) {
//Treat 'after' as the offset to skip to
int skip = Integer.valueOf(after);
//Query Mongo (this is Mongo shell, do whatever you normally do in Java instead)
List<User> users = db.users.find().skip(skip).limit(first);
//Translate to Page
Page<User> userPage = PageFactory.createOffsetBasedPage(users, totalUserCount, skip);
return userPage;
}
创建Page
实例的方法还有很多,包括创建您自己的接口实现。
另一种方式是这样的:
public Page<User> allUsers(int first, String after) {
//This time 'after' is the last seen ID
List<User> users = db.students.find({'_id': {'$gt': after}}).limit(first);
//Translate to Page somehow again (you have to somehow know if there's the next/previous page)
Page<User> userPage = PageFactory.createPage(users, (user, ix) -> () -> user.getId(), hasNextPage, hasPreviousPage);
return userPage;
}
春季数据
如果您使用的是 Spring 数据,则可以返回org.springframework.data.domain.Page
(或Slice
(并配置 SPQR 以将其映射为中继页面。此功能将在下一版本的 SPQR Spring Boot 启动器中开箱即用地受支持。