如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用

Posted

技术标签:

【中文标题】如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用【英文标题】:How do I use GraphQL with Mongoose and MongoDB without creating Mongoose models 【发布时间】:2018-05-19 12:51:14 【问题描述】:

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

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

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

如何做到这一点?

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

【问题讨论】:

我也在想同样的事情。我认为 [Typegoose][1] 将解决这个问题。我会试一试,并在这里更新我的发现。 [1]:github.com/szokodiakos/typegoose Typegoose 和 type-graphql 可以很好地协同工作,因此您的所有数据只需一个真实来源 【参考方案1】:

您应该查看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 架构中使用 getMongoDbQueryResolvergetGraphQLQueryArgs 构建一个字段。包装器提供的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
    

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

【讨论】:

既然你是作者,或许你可以在这里做个简要的介绍?个人博客的引用,无论今天如何精心策划,明天都可能成为死链接。 @jdv 我希望这就够了。 嘿。我会这么认为。很棒的答案。

以上是关于如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用本地PC转换的情况下将我在google colab中训练的tensorflow的protobuf训练模型转换为tensorflowjs?

如何在不创建通知的情况下将图标添加到 Android 状态栏?

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

如何在不创建嵌套数组的情况下将多个变量添加到数组

如何在不更改括号输出的情况下将 2.5 设为下标? ggplot 轴标签

PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?