We have a graphql server (not written in javascript) serving a paginated list of objects. We\'re trying to conform to the relay specification, but we\'ve hit an interesting case
I had the same problem. So, I decided to write a npm
package to handle this issue.
You can use fast-relay-pagination npm package for sorting, backward and forward pagination
and filter Mongoose
model or MongoDB
object.
This package improves graphql-relay
lazy loading by using Mongoose
or MongoDB
find and limit. As you definitely know, graphql-relay's
connectionFromArray
fetchs all data and performs slicing on data, which is not efficient for large amount.
You can see an example in below:
...
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
})
}),
}