我们有一个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如何解决这个问题?
最佳答案
我有同样的问题。因此,我决定编写一个npm
包来处理此问题。
您可以使用fast-relay-pagination npm包对pagination
进行排序,后退和前进,并过滤Mongoose
模型或MongoDB
对象。
该软件包通过使用graphql-relay
或Mongoose
查找和限制来改进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
})
}),
}
关于relayjs - 如何在Relay中管理游标和排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34948216/