sql >> Database >  >> NoSQL >> MongoDB

Hoe gebruik ik GraphQL met Mongoose en MongoDB zonder Mongoose-modellen te maken?

Je zou moeten kijken naar GraphQL-to-MongoDB, of hoe ik leerde om te stoppen met me zorgen te maken en dol was op gegenereerde query-API's . Er wordt gesproken over een middlewarepakket dat gebruikmaakt van de typen van GraphQL om uw GraphQL-API te genereren en verzoeken die van clients zijn verzonden in MongoDB-query's te parseren. Het springt min of meer over Mongoose heen.

Disclaimer:dit is mijn blogbericht.

Het pakket genereert GraphQL-invoertypen voor uw schemaveldargumenten en wikkelt zich rond de resolve-functie om ze te ontleden in MongoDB-query's.

Gegeven een eenvoudig 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 }
                })
            }))
        }
    })
}); 

Voor de meest voorkomende gebruikssituatie bouwt u een veld in het GraphQL-schema met een getMongoDbQueryResolver en getGraphQLQueryArgs . Het filter , projection , en options geleverd door de wrapper kan direct worden doorgegeven aan de zoekfunctie.

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()
    )
}

Een voorbeeld van een vraag die u naar zo'n veld zou kunnen sturen:

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

Er is ook een generator voor wrapper en argumenttypes voor mutatievelden.




  1. Moet ik mijn node redis-clientinstantie afsluiten met .quit()?

  2. Verbinding maken met mongoDB vanuit bash shell-script

  3. Node.js-bestandsupload (Express 4, MongoDB, GridFS, GridFS-Stream)

  4. Wanneer documenten in Mongo DB insluiten?