使用 graphql-spqr、java 和 mongo 进行中继分页
Posted
技术标签:
【中文标题】使用 graphql-spqr、java 和 mongo 进行中继分页【英文标题】:Relay pagination using graphql-spqr, java and mongo 【发布时间】:2019-12-31 19:48:59 【问题描述】:我们如何使用 graphql spqr、java、mongo 创建分页查询?
下面是查询的样子:
allUsers(first : int, last :int, after: String, before: String)
【问题讨论】:
【参考方案1】:没有弹簧
如果您希望 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 将开箱即用地支持此功能。
【讨论】:
以上是关于使用 graphql-spqr、java 和 mongo 进行中继分页的主要内容,如果未能解决你的问题,请参考以下文章
带有 Spring Boot 和事务边界的 graphql-spqr
具有弹簧安全性的 JWT 身份验证 graphql-spqr
Android M MO流程并与Android L MO对比
原创Python3 + Red + PyDev + Eclipse + Subversion + RobotFramework + UI Automator2 + Weditor 构建Web+Mo