Hasura 是我创建应用程序托管 GraphQL API 的最喜爱方式之一。我发现它既简单直观,又适用于各种用例。但是,自从使用 Hasura 以来,我反复看到同一个问题:我们应该如何创建数组?鉴于在行的“类型”下拉列表中未提供array
和map
,那么完成此操作的最佳方法是什么?
实际上,Hasura 可以通过几种不同的方式来捕捉数组的概念,以下是对解决此问题的方法的细分。我个人比较喜欢我们即将介绍的最后一个选项 JSONB,但我们会逐步介绍其他选项,以防您想尝试其他方法,因为每个选项都有略微不同的优势。
方法 1:手动创建字面量数组
Hasura 不提供“array
”作为type
,但我们可以通过选择“文本”并在末尾添加方括号来创建字符串数组,如下所示
我们得到的是text[]
,并且将提示我们通过以下两种方式之一创建数组
["one", "two"]
// or
{"one", "two"}
![insertion of row with type {"foo", "bar"} or ["foo", "bar"]](https://i0.wp.com/css-tricks.com/wp-content/uploads/2020/12/CleanShot-2020-12-12-at-20.00.50@2x.png?resize=1034%2C118&ssl=1)
方法 2:创建关系
我们还可以与另一个包含一系列文本元素的表创建关系。为此,请创建一个具有文本类型的行。
我们还将通过侧边栏中的“添加表”按钮创建一个新表,并创建一个非常简单的行,其中包含我们需要的数据类型(文本、整数或任何其他类型)的唯一键。
现在,点击“关系”选项卡。在表中,选择“数组关系”选项,为其命名,并引用创建的原始表。
第一个表的id
应该与我们刚刚创建的第二个表的id
具有关系。

保存后,您应该会看到关系选项卡中的表中反映了数组关系,箭头表示关系的方向。
users.gameId → favoriteGames.id
现在,我们可以在“GraphiQL”选项卡中查找数组

方法 3:JSONB
以下是我们在 Hasura 中创建数组的最喜爱方法之一。我喜欢它,因为它可以非常高效。我们可以使用“JSONB”类型,并通过从下拉列表中选择 JSONB 来创建数组。然后,将以与text[]
选项类似的方式提示我们

填写后,它将如下所示

从那里,我们不仅可以像上面那样将数组添加到查询中,还可以通过多个索引按标签进行搜索,并且它们的 GraphiQL 选项卡使其易于浏览。请查看我何时按包含“动画”的内容过滤标签
query MyQuery {
codesamples(where: {tags: {_contains: "animation"}}) {
userId
name
id
}
}

但是,这样的查找不一定一开始就高效,尤其是在数据量很大的情况下。幸运的是,我们可以定义要索引的字段。从顶部的“数据”选项卡中,选择侧面板中的“SQL”组,在该区域中,我们可以定义要索引的字段以维护高效的查找。在此示例中,我们将为“标签”字段创建索引
create index codesample_gin on codesamples using gin(tags)
这将运行查询并索引此查找,使其在将来更高效。
总结
Hasura 提供了绝佳的开发者体验,可以设置快速易用的 GraphQL API。对于那些有兴趣使用 Hasura 设置数组的人,我希望本文对您有所帮助。
感谢 Hasura 的 Adron Hall 校对本文。