graphql-advanced-projection
v2.0.0
Published
Fully customizable Mongoose/MongoDB projection generator.
Downloads
406
Maintainers
Readme
graphql-advanced-projection
Fully customizable Mongoose/MongoDB projection generator.
Why
We already have graphql-projection, graphql-mongodb-projection, graphql-db-projection, and graphql-fields-projection.
But graphql-advanced-projection
is different from all of them above in the following ways:
- Separete graphql schema and mongodb projection config. This helps you decouple schema and mongodb into two parts, each of them may change independently. Write graphql in
.graphql
, write config in javascript or.json
. - Easy customization. No more
gqlField: { type: new GraphQLNonNull(GraphQLInt), projection: 'mongoField' }
. SimplygqlField: 'mongoField'
. - We create resolvers.
gqlField: (parent) => parent.mongoField
can be automatically generated, even complicated ones likefirst: (parent) => parent.items.data[0].value
. - Fully supports interfaces, fragments, and inline fragments. Write
typeProj: 'type'
andswitch (parent.type)
in__resolveType
.
Installation
$ npm i graphql-advanced-projection
Usage
For a complete working demo, see the
examples
folder.
Setup mongoose
const UserSchema = new mongoose.Schema({
_id: String,
mongoA: String,
});
const User = mongoose.model('users', UserSchema);
Setup graphql
type Query {
user(id: ID!): User
}
type User {
userId: ID
field1: String
field2: String
}
Setup graphql-advanced-projection
const { project, resolvers } = gqlProjection({
User: {
proj: {
userId: '_id',
field1: 'mongoA',
field2: null,
},
},
});
Combine everything together
const { makeExecutableSchema } = require('@graphql-tools/schema');
/* ... */
module.exports = makeExecutableSchema({
typeDefs,
resolvers: _.merge(resolvers, {
Query: {
async user(parent, args, context, info) {
const proj = project(info);
const result = await User.findById(args.id, proj);
return result.toObject();
},
},
User: {
field2: () => 'Hello World',
},
}),
resolverValidationOptions: { requireResolversForResolveType: false },
});
Run
query {
user(id: $id) {
field1
field2
}
}
proj = {
_id: 0,
mongoA: 1,
}
License
MIT