Powinieneś spojrzeć na GraphQL-to-MongoDB, czyli jak nauczyłem się przestać się martwić i pokochałem generowane zapytania API . Mówi o pakiecie oprogramowania pośredniczącego, który wykorzystuje typy GraphQL do generowania interfejsu API GraphQL i analizuje żądania wysyłane od klientów do zapytań MongoDB. Mniej więcej pomija Mongoose.
Zastrzeżenie:to jest mój post na blogu.
pakiet generuje typy danych wejściowych GraphQL dla argumentów pól schematu i otacza funkcję resolve, aby przeanalizować je w zapytania MongoDB.
Biorąc pod uwagę prosty 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 }
})
}))
}
})
});
W najczęstszym przypadku użycia zbudujesz pole w schemacie GraphQL za pomocą getMongoDbQueryResolver
i getGraphQLQueryArgs
. filter
, projection
i options
dostarczone przez opakowanie można przekazać bezpośrednio do funkcji wyszukiwania.
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()
)
}
Przykład zapytania, które możesz wysłać do takiego pola:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
Dostępny jest również generator typów opakowań i argumentów dla pól mutacji.