您应该查看GraphQL-to-MongoDB, or how I learned to stop worrying and love generated query APIs。它讨论了一个中间件包,它利用 GraphQL 的类型来生成您的 GraphQL API,并将客户端发送的请求解析为 MongoDB 查询。它或多或少会跳过 Mongoose。
免责声明:这是我的博文。
package 为您的架构字段 args 生成 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 }
})
}))
}
})
});
对于最常见的用例,您将在 GraphQL 架构中使用 getMongoDbQueryResolver 和 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
}
}
还有一个用于变异字段的包装器和参数类型生成器。