Je zou moeten kijken naar GraphQL-to-MongoDB, of hoe ik leerde om te stoppen met me zorgen te maken en dol was op gegenereerde query-API's . Er wordt gesproken over een middlewarepakket dat gebruikmaakt van de typen van GraphQL om uw GraphQL-API te genereren en verzoeken die van clients zijn verzonden in MongoDB-query's te parseren. Het springt min of meer over Mongoose heen.
Disclaimer:dit is mijn blogbericht.
Het pakket genereert GraphQL-invoertypen voor uw schemaveldargumenten en wikkelt zich rond de resolve-functie om ze te ontleden in MongoDB-query's.
Gegeven een eenvoudig GraphQLType:
const PersonType = new GraphQLObjectType({
name: 'PersonType',
fields: () => ({
age: { type: GraphQLInt },
name: {
type: new GraphQLNonNull(new GraphQLObjectType({
name: 'NameType',
fields: () => ({
firstName: { type: GraphQLString },
lastName: { type: GraphQLString }
})
}))
}
})
});
Voor de meest voorkomende gebruikssituatie bouwt u een veld in het GraphQL-schema met een getMongoDbQueryResolver
en getGraphQLQueryArgs
. Het filter
, projection
, en options
geleverd door de wrapper kan direct worden doorgegeven aan de zoekfunctie.
person: {
type: new GraphQLList(PersonType),
args: getGraphQLQueryArgs(PersonType),
resolve: getMongoDbQueryResolver(PersonType,
async (filter, projection, options, source, args, context) =>
await context.db.collection('person').find(filter, projection, options).toArray()
)
}
Een voorbeeld van een vraag die u naar zo'n veld zou kunnen sturen:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
Er is ook een generator voor wrapper en argumenttypes voor mutatievelden.