【问题标题】:Resolve nested GraphQL queries that don't match DB schema解决与数据库架构不匹配的嵌套 GraphQL 查询
【发布时间】:2021-10-19 20:03:30
【问题描述】:

TLDR:如何解决嵌套 GraphQL 查询,其中 GQL 架构与存储在 MongoDB 数据库中的数据不同?

我们有一个应用程序,其中我们数据库中的每个用户都有一组外键,这些外键引用其他文档,在本例中为“宠物”。这些宠物在一个单独的集合中。

{
  "humans": [
    {
      "id": "1",
      "name": "bob",
      "pets": [
        "jBWMVGjm50l5LGwepDoty1",
        "jBWMVGjm50l5LGwepDoty12"
      ]
    }
  ]
}

我在这个数据库前面有一个 GraphQL API,我正在尝试编写我的解析器来处理嵌套查询。问题是我们的 GraphQL 模式与 DB 模式不匹配。在 Human 类型内部,pets 字段需要一个宠物数组,如下所示:

  type Human {
    id: ID!
    name: String!
    pets: [Pet!] # This is an array of pet objects...
    gender: String!
    hair: String!
    favoriteNum: Int!
    alive: Boolean!
    createdAt: Int!
  }

目前,人类解析器将通过他/她的 ID 查询人类,并返回该人类,如下所示:

human(parent, { input }, { models }) {
   return models.Human.findOne({ id: input.id });
}

显然,这里的问题是从数据库返回的人不符合 GQL 模式。 “宠物”数组不是对象数组,而是 ID 数组。解决此类查询的正确方法是什么?

我们尝试在人类解析器inside 中为人类宠物添加另一个数据库调用。这里的问题是,如果有人只查询人类的名字,我们的解析器将不得不去获取所有的宠物数据,即使我们的用户没有请求它......

但是,如果我们的宠物有外键,同样的问题会再次出现!我们如何解决这个问题?

【问题讨论】:

    标签: javascript mongodb graphql


    【解决方案1】:

    这看起来像是一个设计问题。 Graphql 应该总是解析一个图,所以你的查询调用者可以确保接收到这个对象的所有引用。让我们以您的人类类型并将其视为呼叫者。当调用者看到人类对象中有pets 时,他认为他通过执行如下查询接收到该对象

    query(
      human(id) {
        pets {
           stuffOnlyPetshave
        }
      }
    )
    

    因此,一种方法是在人工解析器中从您的数据库中查询宠物。这应该是获取完整图表的默认方式。

    但是,如果您想避免对每个人工查询都进行数据库查询,那么您应该在前端进行条件宠物查询。

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2021-01-14
      • 2021-01-29
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多