3. GraphQL Query

GraphQL 查询语言GraphQL 的主要部分。在这节课中,我们将学习如何对GraphQL服务器进行查询,以及熟悉查询语法。

我们将查询一个典型的博客应用的数据集(正如我们前面讨论过的)。现在,不用考虑 GraphQL 服务器的工作原理,以及它的 Schema 的实现。我们将只专注于查询语法,以及如何使用它。

在本节课结束后,你会对GraphQL 以及怎么写 GraphQL Query 有一定的理解。

开始吧。

Hello GraphQL

让我们写第一个 GraphQL Query: 检索 HIS 中最近一个患者的姓名。为了执行 Query,我们打开GraphQL Sandbox

运行这句Query:

{
  patient {
    name
  }
}

然后你会看到:

{
  "data": {
    "patient": {
      "name": "xxxx"
    }
  }
}

使用此Query,我们要求 GraphQL 服务器发送图的根域字段 patient(也被称为“根查询字段”)。此外,我们只需要结果对象中的姓名。

Get practitioner

这有你的第一个任务。 在我们的GraphQL Schema中,有个根查询字段——practitioner。尝试查询字段。

任务: 在GraphQL Sandbox中使用以下查询,选择不在查询结果中的医生:

{
  practitioners {
    _id,
    name,
    identifier
  }
}
  • Arunoda Susiripala
  • Pahan Sarathchandra
  • Kasun Indi
  • Somapala Lamaya ✔️

嵌套查询

GraphQL中,我们可以使用嵌套查询的方式。举个例子: 我们可以使用单个GraphQL查询,来 检索所有的预约挂号请求记录以及它们的患者

调用这个查询:

{
  appointmentRequests {
    _id,
    type,
    reason,
    status,
    patient {
      name,
    }
  } 
}

通过这种方式,我们可以根据需求深入嵌套我们的graph

现在,我们需要 在获取所有预约挂号记录的同时,获取每一条记录的医生名字

提示: 查看 GraphQL SchemaDocs 部分,可以获取关于 Schema 更多的信息。同时,自动补全的功能也可以帮到你。

// query正确的写法
{
  appointmentRequests {
    _id,
    type,
    reason,
    status,
    patient {
      name,
    },
    practitioner {
      name,
    }
  } 
}

参数

我们可以通过指定任一字段来过滤输出。此外,我们还需要根据指定类型来获取子数据集,而不是获得整个数据集。这就要用到 参数

以从 HIS 获取最新的预约挂号记录为例,查询语句如下:

{
  recentAppointmentRequests(count: 5) {
    _id
  }
}

你会从 HIS 中检索最近的五条预约挂号记录。尝试修改count,来观察它的变化。

在这里,count是根查询字段 recentAppointmentRequests 定义好的参数。你可以在GraphQL SandboxDocs 部分进行查看。

嵌套字段的参数

就像在 根查询字段 的参数一样,您也可以为嵌套字段添加参数。举个例子,我们可以从Schema中检索的患者证件号码的数量。

  • 获取最新发布的两条预约挂号记录
  • 限制每条预约挂号记录的practitioners数 最大为1(使用limit
{
  recentAppointmentRequests(count: 2) {
    _id,
    patient {
      identifiers(limit: 1)
    }
  }
}

多字段

在的 GraphQL 查询中,我们可以写很多根查询字段。在服务端,所有的这些字段都会被并行处理,并作为一个整体返回结果。

让我们看看一个例子。同时获取最新预约挂号记录和患者。

// 同时获取患者和最近预约挂号记录
{
  latestAppointmentRequest {
    _id
  },
  patient {
    name
  }
}

就像那样,你可以添加任意数量的根查询字段。去玩吧!

将结果赋值给变量

此时,我们看看前一步的查询结果:

{
  "data": {
    "latestAppointmentRequest": {
      "_id": "03390abb5570ce03ae524397d215713a"
    },
    "patient": {
        "_id": "03390abb5570ce03ae524397xxxxxx",

        "identifier": {
        "cardType": "01",
        "cardNo": "身份证号码",
        "cardName": "身份证"
        },
        "name": "Peter James1",      
      }
  }
}

假设你想在一个查询中多次查询同一个根查询字段。

举个例子,我们想要将 patientname_id 作为两个结果分别获得:

{
  latestAppointmentRequest {
    _id
  },

  patient {
    name
  },

  patient {
    _id
  }
}

// 但是,这么写,它的结果是这样的
// 它不会分两个结果返回
{
  "data": {
    "latestAppointmentRequest": {
      "_id": "03390abb5570ce03ae524397d215713a"
    },
    "patient": {
        "id": "03390abb5570ce03ae524397xxxxxx",
        "name": "Peter James1",      
      }
  }
}

// 如果需要分两个结果返回
// 则需要将查询结果赋值给一个变量
{
  latestAppointmentRequest: latestAppointmentRequest {
    title
  },

  patientNames: patient {
    name
  },

  patientIds: patient {
    _id
  }
}

results matching ""

    No results matching ""