如何在Relay中管理游标和排序?

时间:2016-01-22 13:47:19

标签: relayjs

我们有一个graphql服务器(不是用javascript编写),用于提供对象的分页列表。我们正在努力遵守继电器规范,但我们已经找到了一个可以使用澄清的有趣案例。

具体来说:游标是否可以依赖连接的其他输入?与https://github.com/graphql/graphql-relay-js/issues/20类似,我们的连接采用sort_key参数来确定返回列表的排序顺序。根据指定的排序顺序,对象的边可能返回不同的游标值(因为服务器在每种情况下都需要不同的信息来确定下一个对象)。但是,仔细阅读https://facebook.github.io/relay/docs/guides-mutations.html#range-add表明这是不允许的;返回新创建的边的突变必须返回一个光标,该光标可以普遍应用于可能出现该边的所有可能列表? facebook如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。所以,我决定写一个npm包来处理这个问题。

您可以使用fast-relay-pagination npm包进行排序,向后和向前pagination以及过滤Mongoose模型或MongoDB对象。

此软件包使用graphql-relayMongoose查找和限制来改进MongoDB 延迟加载。如您所知,graphql-relay's connectionFromArray获取所有数据并对数据执行切片,这对于大量数据而言效率不高。

您可以在下面看到一个示例:

...
import {
  fetchConnectionFromArray
} from 'fast-relay-pagination'
...
export default{
  type: orderConnection.connectionType,
  args: {
    ...connectionArgs,
    orderFieldName: {
      type: GraphQLString,
    },
    sortType: {
      type: GraphQLInt,
    },
  },
  resolve: needAdmin(async (_, args) => {
    let orderFieldName = args.orderFieldName || '_id'
    let sortType = args.sortType || -1
    let after = args.after
    let before = args.before
    let filter = args.filter
    let first = args.first
    let last = args.last
    return fetchConnectionFromArray({
      dataPromiseFunc: SampleModel.find.bind(SampleModel), // required
      filter, // optional (for using filter on model collection) - for example => {username: 'test'} 
      after, //optiona
      before, // optional
      first, //optional
      last, // optional
      orderFieldName, // optional
      sortType, // optional
    })
  }),
}

答案 1 :(得分:2)

是的,光标应包含足够的信息,以便从该点开始提取下一页(包括排序和过滤等约束),但是否/如何执行此操作取决于您,因为它是特定于实现的

对于突变,您可以在getConfigs()实施中基于每次通话指定rangeBehaviors。因此,如果您有一个排序视图,您可以根据排序顺序选择追加或前置。此行为指定Relay将在客户端执行哪些操作以更新其存储。您仍然有责任确保GraphQL服务器获取所需的所有信息(通过输入变量)以正确执行实际变异。