sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo uso GraphQL con Mongoose y MongoDB sin crear modelos Mongoose?

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.