mongodb - 如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 结合使用

标签 mongodb mongoose graphql

在 Mongoose 中创建模型毫无意义,因为此类模型已经使用 GraphQL 和现有构造(即 TypeScript 接口(interface))创建。

我们如何让 GraphQL 在 GraphQL 提供的模型上使用 Mongoose 的操作,而不必在 Mongoose 中重新创建模型?

此外,似乎应该有一个 GraphQL 的包装器,它只与数据库通信,避免编写 MyModel.findById 等

如何做到这一点?

互联网上讨论 GraphQL 和 Mongodb 的每个示例都使用 Mongoose。

最佳答案

您应该查看GraphQL-to-MongoDB, or how I learned to stop worrying and love generated query APIs 。它讨论了一个中间件包,该包利用 GraphQL 的类型来生成 GraphQL API 并将客户端发送的请求解析为 MongoDB 查询。它或多或少地跳过了 Mongoose。

免责声明:这是我的博客文章。

package为您的架构字段参数生成 GraphQL 输入类型,并包装解析函数以将它们解析为 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 }
                })
            }))
        }
    })
}); 

对于最常见的用例,您将使用 getMongoDbQueryResolvergetGraphQLQueryArgs 在 GraphQL 架构中构建一个字段。包装器提供的filterprojectionoptions可以直接传递给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
    }
}

还有一个用于突变字段的包装器和参数类型生成器。

关于mongodb - 如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47660758/

相关文章:

mongodb - NoSQL关键字在大表中搜索

django - Mongodb 服务器未启动

mongodb - Mongoose - 找不到结果时总是返回 null 而不是错误?

c# - 如何使用.net Graphql NuGet在线查询现有数据库? (C#)

c# - 在 ASP.NET Core 中实现 GraphQL(GraphQL for .Net),为什么我的查询是 :ObjectGraphType class not being registered by dependency injection?

node.js - 查询mongodb的条件条件

linux - 在 AWS linux 上通过 yum 安装 MongoDB 失败 : HTTPS Error 404 - Not Found

graphql - Apollo/GraphQL 具有不同参数的相同查询

node.js - 在Mongoose中填充后查询

javascript - 在 Mongoose 的字段中定义一个函数作为默认值