【问题标题】:Relay pagination using graphql-spqr, java and mongo使用 graphql-spqr、java 和 mongo 进行中继分页
【发布时间】: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


    【解决方案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.skipcursor.limit 而不是SQL 的LIMITOFFSET

    简而言之,您可以执行以下操作:

    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 将开箱即用地支持此功能。

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2019-04-05
      • 2018-10-07
      • 2019-10-13
      • 2020-08-19
      • 2019-09-20
      • 2018-02-01
      • 2018-08-05
      • 2017-11-18
      相关资源
      最近更新 更多