Like
connectionFromArray()
but for MongoDB cursors
npm install --save relay-mongodb-connection
Give it a cursor from mongodb, and it handles pagination int he same way graphql-relay does for arrays.
import connectionFromMongoCursor from 'relay-mongodb-connection';
Also supports mongoose's querys and aggregations.
import { connectionFromMongooseQuery } from 'relay-mongodb-connection';
import { connectionFromMongooseAggregate } from 'relay-mongodb-connection';
Pass it a MongoDB cursor and connectionArgs
, and it's happy.
resolve(obj, { ...args }) {
return connectionFromMongoCursor(
db.collection('users').find({}),
args
);
}
Optionally give it a mapper function:
resolve(obj, { ...args }) {
return connectionFromMongoCursor(
db.collection('users').find({}),
args,
(user) => Object.assign(user, { id: user._id })
);
}
And for Mongoose users:
resolve(obj, { ...args }) {
return connectionFromMongooseQuery(
User.find({}), // User.aggregate() also works
args,
(user) => Object.assign(user, { id: user._id })
);
}
// ...
import connectionFromMongoCursor from 'relay-mongodb-connection';
// ...
// Instead of resolving, synchronously returns a MongoDB Cursor.
function getSpaceshipsForUser(userId) {
return db.collection('spaceships').find({
user: new ObjectId(userId)
});
}
export const GraphQLUser = new GraphQLObjectType({
name: 'User',
fields: {
id: globalIdField('User'),
spaceships: {
type: SpaceshipConnection,
args: {
...connectionArgs,
},
resolve(user, { ...args }) {
const spaceshipCursor = getSpaceshipsForUser(user._id);
return connectionFromMongoCursor(spaceshipCursor, args);
}
}
}
});
connectionFromMongoCursor
automatically skips and limits the MongoDB Cursor so that only the necessary documents are retrieved from the database.
See CHANGELOG.md
MONGO_URL=mongodb://192.168.99.100/mongodbconnection npm test
MIT © Mikael Berg