GraphQL-to-MongoDB、または心配をやめて生成されたクエリAPIを愛する方法を学んだ 。 GraphQLのタイプを活用してGraphQLAPIを生成し、クライアントから送信されたリクエストをMongoDBクエリに解析するミドルウェアパッケージについて説明します。多かれ少なかれマングースをスキップします。
免責事項:これは私のブログ投稿です。
パッケージ スキーマフィールド引数のGraphQL入力タイプを生成し、resolve関数をラップアラウンドしてそれらをMongoDBクエリに解析します。
単純な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 }
})
}))
}
})
});
最も一般的なユースケースでは、getMongoDbQueryResolver
を使用してGraphQLスキーマにフィールドを構築します。 およびgetGraphQLQueryArgs
。 filter
、projection
、およびoptions
ラッパーによって提供されるものは、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()
)
}
このようなフィールドに送信できるクエリの例:
{
person (
filter: {
age: { GT: 18 },
name: {
firstName: { EQ: "John" }
}
},
sort: { age: DESC },
pagination: { limit: 50 }
) {
name {
lastName
}
age
}
}
ミューテーションフィールド用のラッパーと引数タイプジェネレーターもあります。