0

我们如何使用 graphql spqr、java、mongo 创建分页查询?

下面是查询的样子:

allUsers(第一个:int,最后一个:int,之后:字符串,之前:字符串)

4

1 回答 1

1

没有弹簧

如果您希望 SPQR 自动将结果映射为中继页面,请确保Page<>从您的方法返回 a。所以像:

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.skipandcursor.limit而不是 SQL 的LIMITand 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 将开箱即用地支持此功能。

于 2019-09-10T15:29:59.040 回答