relay-mongodb-connection
Version:
MongoDB connection for Relay
109 lines (83 loc) • 2.75 kB
Markdown
# relay-mongodb-connection [](https://travis-ci.org/mikberg/relay-mongodb-connection) [](https://coveralls.io/github/mikberg/relay-mongodb-connection?branch=master)
> Like `connectionFromArray()` but for MongoDB cursors
## Install
```sh
npm install --save relay-mongodb-connection
```
## Usage
Give it a cursor from [mongodb](https://www.npmjs.com/package/mongodb), and it handles pagination int he same way [graphql-relay](https://github.com/graphql/graphql-relay-js/blob/master/src/connection/arrayconnection.js) does for arrays.
```js
import connectionFromMongoCursor from 'relay-mongodb-connection';
```
Also supports [mongoose](http://mongoosejs.com/index.html)'s querys and aggregations.
```js
import { connectionFromMongooseQuery } from 'relay-mongodb-connection';
import { connectionFromMongooseAggregate } from 'relay-mongodb-connection';
```
### At a glance
Pass it a MongoDB cursor and `connectionArgs`, and it's happy.
```js
resolve(obj, { ...args }) {
return connectionFromMongoCursor(
db.collection('users').find({}),
args
);
}
```
Optionally give it a mapper function:
```js
resolve(obj, { ...args }) {
return connectionFromMongoCursor(
db.collection('users').find({}),
args,
(user) => Object.assign(user, { id: user._id })
);
}
```
And for Mongoose users:
```js
resolve(obj, { ...args }) {
return connectionFromMongooseQuery(
User.find({}), // User.aggregate() also works
args,
(user) => Object.assign(user, { id: user._id })
);
}
```
### Example
```js
// ...
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.
## Changelog
See [CHANGELOG.md](CHANGELOG.md)
## Testing
```sh
MONGO_URL=mongodb://192.168.99.100/mongodbconnection npm test
```
## License
MIT © [Mikael Berg](https://github.com/mikberg)