Du bör titta på GraphQL-to-MongoDB, eller hur jag lärde mig att sluta oroa mig och älska genererade fråge-API:er . Den talar om ett mellanprogrampaket som utnyttjar GraphQL:s typer för att generera ditt GraphQL API och analyserar förfrågningar som skickas från klienter till MongoDB-frågor. Den hoppar mer eller mindre över Mongoose.
Ansvarsfriskrivning:det här är mitt blogginlägg.
paketet genererar GraphQL-indatatyper för dina schemafältsarg och lindar upplösningsfunktionen för att analysera dem i MongoDB-frågor.
Givet en enkel 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 }
})
}))
}
})
});
För det vanligaste användningsfallet bygger du ett fält i GraphQL-schemat med en getMongoDbQueryResolver
och getGraphQLQueryArgs
. filter
, projection
och options
som tillhandahålls av omslaget kan skickas direkt till sökfunktionen.
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()
)
}
Ett exempel på en fråga du kan skicka till ett sådant fält:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
Det finns också en omslags- och argumenttypgenerator för mutationsfält.