Deberías mirar GraphQL-to-MongoDB, o cómo aprendí a dejar de preocuparme y amar las API de consultas generadas . Habla de un paquete de middleware que aprovecha los tipos de GraphQL para generar su API de GraphQL y analiza las solicitudes enviadas por los clientes en consultas de MongoDB. Se salta más o menos Mongoose.
Descargo de responsabilidad:esta es mi publicación de blog.
El paquete genera tipos de entrada de GraphQL para sus argumentos de campo de esquema y ajusta la función de resolución para analizarlos en consultas de MongoDB.
Dado un GraphQLType simple:
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 }
})
}))
}
})
});
Para el caso de uso más común, creará un campo en el esquema de GraphQL con un getMongoDbQueryResolver
y getGraphQLQueryArgs
. El filter
, projection
y options
proporcionado por el contenedor se puede pasar directamente a la función de búsqueda.
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 ejemplo de una consulta que podría enviar a dicho campo:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
También hay un generador de tipos de argumentos y contenedores para campos de mutación.