MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie verwende ich GraphQL mit Mongoose und MongoDB, ohne Mongoose-Modelle zu erstellen?

Sie sollten sich GraphQL-to-MongoDB, oder wie ich gelernt habe, mir keine Sorgen mehr zu machen und generierte Abfrage-APIs zu lieben . Es handelt sich um ein Middleware-Paket, das die Typen von GraphQL nutzt, um Ihre GraphQL-API zu generieren, und von Clients gesendete Anfragen in MongoDB-Abfragen parst. Es überspringt mehr oder weniger Mongoose.

Haftungsausschluss:Dies ist mein Blogbeitrag.

Das Paket generiert GraphQL-Eingabetypen für Ihre Schemafeld-Argumente und umschließt die Auflösungsfunktion, um sie in MongoDB-Abfragen zu parsen.

Bei einem einfachen 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 }
                })
            }))
        }
    })
}); 

Für den häufigsten Anwendungsfall erstellen Sie ein Feld im GraphQL-Schema mit einem getMongoDbQueryResolver und getGraphQLQueryArgs . Der filter , projection , und options vom Wrapper bereitgestellt werden, können direkt an die find-Funktion übergeben werden.

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

Ein Beispiel für eine Abfrage, die Sie an ein solches Feld senden könnten:

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

Es gibt auch einen Wrapper und einen Generator für Argumenttypen für Mutationsfelder.