Graphql 是否有一种方法可以将每个项目与一个已修改的值进行比较?

Graphql 是否有一种方法可以将每个项目与一个已修改的值进行比较?,graphql,hasura,Graphql,Hasura,我对graphQL和Hasura是新手。我尝试(在Hasura中)让我的用户提供自定义聚合(理想情况下是以普通graphQL查询的形式),然后将结果与聚合进行比较 这里有一个例子。假设我有这个模式: USERTABLE: userID Name Age City Country Gender HairColor INCOMETABLE: userID Income 我在hasura中创建了一个关系,我可以查询数据,但我的用户希望对用户的收入水平进行自定义评分。例如,一个用户可能希望查询按国家

我对graphQL和Hasura是新手。我尝试(在Hasura中)让我的用户提供自定义聚合(理想情况下是以普通graphQL查询的形式),然后将结果与聚合进行比较

这里有一个例子。假设我有这个模式:

USERTABLE:
userID
Name
Age
City
Country
Gender
HairColor

INCOMETABLE:
userID
Income
我在hasura中创建了一个关系,我可以查询数据,但我的用户希望对用户的收入水平进行自定义评分。例如,一个用户可能希望查询按国家和性别细分的数据

对于第一个示例,结果可能是:

{Country : Canada
 { gender : female
  { userID: 1, 
    Name: Nancy Smith,..
    #data below is on aggregated results
    rank: 1
    %fromAverage: 35%
  }...
我所挣扎的是显示与聚合数据相关的用户信息的数据

对于排名,我通过排序获得顺序,但我不确定如何显示相对排名,对于%fromAverage,我根本不确定如何显示


在哈苏拉有办法做到这一点吗?我怀疑actions可能可以做到这一点,但我不确定。

您可以使用跟踪Postgres视图。视图中的字段数量与您希望在SQL中计算的字段数量相同,并在GraphQLAPI上作为一个单独的“表”进行跟踪

我在下面给出的例子是基于一个简化,其中您只有一个名为contacts的表,只有一个名为:
id
的字段,它是一个自动整数。我只是将当前联系人的id添加到avg(id)(这是一个毫无意义的尝试,只是为了说明…)。显然,您可以根据自己的喜好定制逻辑

视图的简单实现如下所示(确保在hasura中点击“跟踪此项”:

CREATE OR REPLACE VIEW contact_with_custom AS
SELECT id, (SELECT AVG(ID) FROM contacts) + id as custom FROM contacts;

另一种选择是使用计算字段。这只是一个postgres函数,它将一行作为参数并返回一些数据,它只是向Graphql API中现有的“表”中添加一个新字段,该字段是该函数的返回值。(您不需要“跟踪此”函数;在Hasura的SQL部分中创建后,您可以将其作为相关表的“修改”下的“计算字段”添加)需要注意的是,此选项不允许您按此计算函数进行筛选,而在视图中,所有字段都是可筛选的

在上述同一模式中,计算字段的函数如下所示:

CREATE OR REPLACE FUNCTION custom(contact contacts)
RETURNS Numeric AS $$
    SELECT (SELECT AVG(ID) from contacts ) + contact.id
$$ LANGUAGE sql STABLE;
然后你为你的计算字段选择这个函数,给它命名你想要的名字


请参见

为什么不在你的客户端代码中进行动态计算?你的前端堆栈是什么?@AbrahamLabkovsky问得好!我只是提供了一个API,我的用户有自己的客户端软件。我认为如果他们能直接通过查询进行评分,这将是一个很酷的附加值。