MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como uso o GraphQL com Mongoose e MongoDB sem criar modelos de Mongoose


Você deve ver GraphQL-to-MongoDB, ou como aprendi a parar de me preocupar e amar APIs de consulta geradas . Ele fala sobre um pacote de middleware que aproveita os tipos do GraphQL para gerar sua API do GraphQL e analisa solicitações enviadas de clientes para consultas do MongoDB. Ele mais ou menos salta sobre Mongoose.

Isenção de responsabilidade:esta é a minha postagem no blog.

O pacote gera tipos de entrada GraphQL para seus argumentos de campo de esquema e envolve a função resolve para analisá-los em consultas MongoDB.

Dado um GraphQLType simples:
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 o caso de uso mais comum, você criará um campo no esquema GraphQL com um getMongoDbQueryResolver e getGraphQLQueryArgs . O filter , projection , e options fornecido pelo wrapper pode ser passado diretamente para a função find.
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()
    )
}

Um exemplo de uma consulta que você pode enviar para esse campo:
{
    person (
        filter: {
            age: { GT: 18 },
            name: { 
                firstName: { EQ: "John" } 
            }
        },
        sort: { age: DESC },
        pagination: { limit: 50 }
    ) {
        name { 
            lastName
        }
        age
    }
}

Há também um gerador de tipos de argumento e wrapper para campos de mutação.