【发布时间】:2019-12-31 19:48:59
【问题描述】:
我们如何使用 graphql spqr、java、mongo 创建分页查询?
下面是查询的样子:
allUsers(first : int, last :int, after: String, before: String)
【问题讨论】:
标签: mongodb spring-data-mongodb graphql-java graphql-spqr
我们如何使用 graphql spqr、java、mongo 创建分页查询?
下面是查询的样子:
allUsers(first : int, last :int, after: String, before: String)
【问题讨论】:
标签: mongodb spring-data-mongodb graphql-java graphql-spqr
没有弹簧
如果您希望 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 中进行真正的基于光标的分页(你给它最后一次看到的光标并要求下一批项目),但如果不能,你总是可以将它转换为简单的偏移量-基于分页或使用您可以排序的任何字段的值作为光标。
请参阅my answer here 了解如何实施这些方法。它描述了一种适用于关系数据库的解决方案,但逻辑是相同的。例如。您使用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 Data,则可以返回 org.springframework.data.domain.Page(或 Slice)并配置 SPQR 以将其映射为中继页面。下一版 SPQR Spring Boot Starter 将开箱即用地支持此功能。
【讨论】: