MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come si usa GraphQL con Mongoose e MongoDB senza creare modelli Mongoose

Dovresti guardare GraphQL-to-MongoDB, o come ho imparato a smettere di preoccuparmi e ad amare le API di query generate . Parla di un pacchetto middleware che sfrutta i tipi di GraphQL per generare la tua API GraphQL e analizza le richieste inviate dai client nelle query MongoDB. Salta più o meno Mongoose.

Disclaimer:questo è il mio post sul blog.

Il pacchetto genera i tipi di input GraphQL per gli argomenti dei campi dello schema e esegue il wrapping della funzione di risoluzione per analizzarli nelle query MongoDB.

Dato un semplice 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 }
                })
            }))
        }
    })
}); 

Per il caso d'uso più comune, creerai un campo nello schema GraphQL con un getMongoDbQueryResolver e getGraphQLQueryArgs . Il filter , projection e options fornito dal wrapper può essere passato direttamente alla funzione di ricerca.

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 esempio di query che potresti inviare a un campo simile:

{
    person (
        filter: {
            age: { GT: 18 },
            name: { 
                firstName: { EQ: "John" } 
            }
        },
        sort: { age: DESC },
        pagination: { limit: 50 }
    ) {
        name { 
            lastName
        }
        age
    }
}

C'è anche un generatore di wrapper e tipi di argomenti per i campi di mutazione.