Sie sollten sich GraphQL-to-MongoDB, oder wie ich gelernt habe, mir keine Sorgen mehr zu machen und generierte Abfrage-APIs zu lieben . Es handelt sich um ein Middleware-Paket, das die Typen von GraphQL nutzt, um Ihre GraphQL-API zu generieren, und von Clients gesendete Anfragen in MongoDB-Abfragen parst. Es überspringt mehr oder weniger Mongoose.
Haftungsausschluss:Dies ist mein Blogbeitrag.
Das Paket generiert GraphQL-Eingabetypen für Ihre Schemafeld-Argumente und umschließt die Auflösungsfunktion, um sie in MongoDB-Abfragen zu parsen.
Bei einem einfachen 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 den häufigsten Anwendungsfall erstellen Sie ein Feld im GraphQL-Schema mit einem getMongoDbQueryResolver
und getGraphQLQueryArgs
. Der filter
, projection
, und options
vom Wrapper bereitgestellt werden, können direkt an die find-Funktion übergeben werden.
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()
)
}
Ein Beispiel für eine Abfrage, die Sie an ein solches Feld senden könnten:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
Es gibt auch einen Wrapper und einen Generator für Argumenttypen für Mutationsfelder.