MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment utiliser GraphQL avec Mongoose et MongoDB sans créer de modèles Mongoose

Vous devriez regarder GraphQL-to-MongoDB, ou comment j'ai appris à ne plus m'inquiéter et à aimer les API de requêtes générées . Il parle d'un package middleware qui exploite les types de GraphQL pour générer votre API GraphQL et analyse les requêtes envoyées par les clients dans les requêtes MongoDB. Il saute plus ou moins Mongoose.

Avis de non-responsabilité :ceci est mon article de blog.

Le paquet génère des types d'entrée GraphQL pour vos arguments de champ de schéma et encapsule la fonction de résolution pour les analyser dans des requêtes MongoDB.

Étant donné un simple 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 }
                })
            }))
        }
    })
}); 

Pour le cas d'utilisation le plus courant, vous allez créer un champ dans le schéma GraphQL avec un getMongoDbQueryResolver et getGraphQLQueryArgs . Le filter , projection , et options fourni par le wrapper peut être passé directement à la fonction de recherche.

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 exemple de requête que vous pourriez envoyer à un tel champ :

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

Il existe également un wrapper et un générateur de types d'arguments pour les champs de mutation.