Dovresti guardare GraphQL-to-MongoDB, o come ho imparato a smettere di preoccuparmi e ad amare le API di query generate . Parla di un pacchetto middleware che sfrutta i tipi di GraphQL per generare la tua API GraphQL e analizza le richieste inviate dai client nelle query MongoDB. Salta più o meno Mongoose.
Disclaimer:questo è il mio post sul blog.
Il pacchetto genera i tipi di input GraphQL per gli argomenti dei campi dello schema e esegue il wrapping della funzione di risoluzione per analizzarli nelle query MongoDB.
Dato un semplice 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 }
})
}))
}
})
});
Per il caso d'uso più comune, creerai un campo nello schema GraphQL con un getMongoDbQueryResolver
e getGraphQLQueryArgs
. Il filter
, projection
e options
fornito dal wrapper può essere passato direttamente alla funzione di ricerca.
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()
)
}
Un esempio di query che potresti inviare a un campo simile:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
C'è anche un generatore di wrapper e tipi di argomenti per i campi di mutazione.