gpt4 book ai didi

amazon-dynamodb - AWS AppSync查询以成形响应数据(类似于SQL中的分组依据)

转载 作者:行者123 更新时间:2023-12-04 07:12:45 25 4
gpt4 key购买 nike

我有一个DynamoDB表,其中包含客户端所需的所有数据,但是,我想对客户端接收的数据进行整形以减少客户端的操作。

我的架构:

type StateCounty {
id: ID!
StateName: String
CountyName: String
FIPSST: Int
FIPSCNTY: Int
Penetration: String
Date: String

}


并返回一个自定义查询,我有以下类型:

type Query {
getStateCountybyState(StateName: String): StateCountyConnection
}


这有效-并有一个简单的查询

query  getStateCountybyState {
getStateCountybyState (StateName: "Delaware") {
items {
StateName
CountyName
Date

}
}
}


结果按预期返回:

 {
"StateName": "Delaware",
"CountyName": "Kent",
"Date": "02-01-2017"
},
{
"StateName": "Delaware",
"CountyName": "Sussex",
"Date": "02-01-2016"
},
{
"StateName": "Delaware",
"CountyName": "New Castle",
"Date": "02-01-2018"
}


等等

我想以以下格式返回数据:

 {
"StateName": "Delaware" {

{ "CountyName": "Kent",
"Date": "02-01-2017"
},
{
"CountyName": "Sussex",
"Date": "02-01-2016"
},
{
"CountyName": "New Castle",
"Date": "02-01-2018"
}
}
}


我尝试将GroupCounty:[StateCountyGroup]添加到架构中:

type StateCounty {
id: ID!
StateName: String
CountyName: String
FIPSST: Int
FIPSCNTY: Int
Penetration: String
Date: String
GroupCounty: [StateCountyGroup]
}


然后在查询中引用它

query  getStateCountybyState {
getStateCountybyState (StateName: "Delaware") {
items {
StateName
CountyName
Date
GroupCounty: [StateCountyGroup]
}
}
}


我认为我的问题在解析器中-当前,它配置为使用StateName作为键,但是我不确定如何将StateName从主查询传递给子查询。

解析器:

{
"version" : "2017-02-28",
"operation" : "Query",
"query" : {
"expression" : "StateName = :StateName",
"expressionValues" : {
":StateName" : { "S" : "${context.arguments.StateName}" },
}
},
"index" : "StateName-index-copy",
"select" : "ALL_ATTRIBUTES",

}


任何指导表示赞赏-我已经阅读了几次文档,但找不到示例。

更新

我尝试了以下来自Richard的建议-肯定是正确的,但是,尽管主题有多种变化,但我还是返回null或以下错误(为简洁起见,我消除了错误中返回的一些县对象):

"message": "Unable to convert set($myresponse = {\n  \"Delaware\": 
[{SSA=8000, Eligibles=32295, FIPS=10001, StateName=Delaware, SSACNTY=0,
Date=02-01-2016, CountyName=Kent, Enrolled=3066, Penetration=0.0949,
FIPSCNTY=1, FIPSST=10, SSAST=8, id=6865},
{SSA=8010, Eligibles=91332, FIPS=10003, StateName=Delaware, SSACNTY=10, Date=02-01-2016, CountyName=New Castle, Enrolled=10322, Penetration=0.113, FIPSCNTY=3, FIPSST=10, SSAST=8, id=6866},
{SSA=0, Eligibles=10, FIPS=10, StateName=Delaware, SSACNTY=0, Date=02-01-2018, CountyName=Pending County Designation, Enrolled=0, Penetration=0, FIPSCNTY=0, FIPSST=10, SSAST=0, id=325},
{SSA=8000, Eligibles=33371, FIPS=10001, StateName=Delaware, SSACNTY=0, Date=02-01-2017, CountyName=Kent, Enrolled=3603, Penetration=0.108, FIPSCNTY=1, FIPSST=10, SSAST=8, id=3598},
{SSA=8020, Eligibles=58897, FIPS=10005, StateName=Delaware, SSACNTY=20, Date=02-01-2016, CountyName=Sussex, Enrolled=3760, Penetration=0.0638, FIPSCNTY=5, FIPSST=10, SSAST=8, id=6867}) \nnull\n\n to class java.lang.Object."
}
]
}

最佳答案

通过阅读以上内容,听起来您的原始查询返回的是您想要的正确结果,但返回的格式不是您希望的,因为您希望“ StateName”是一个顶级JSON键,其值为您作为参数传入的状态的JSON对象。准确吗?如果是这样,那为什么不使用已经有效但使用不同响应模板的相同查询。就像是:

#set($myresponse = {
"$ctx.args.StateName": $ctx.result.items
})
$util.toJson($myresponse)


请注意, $myresponse与上面的示例不完全相同,因为 "stateName" : "Delaware" { ... }的示例不是完全有效的JSON,因此我不想假设什么是好的结构,但是重点仍然是如果您已经从查询中获得了正确的结果,我将尝试更改GraphQL结果的结构。

现在,如果我误读了上面的内容,而您没有从查询中获得正确的结果,那么我可以读取您的“主查询到子查询”的另一种方式是,您尝试将其他 "filter"应用于您的查询结果。如果是这种情况,那么您需要这样的事情:

{
"version" : "2017-02-28",
"operation" : "Query",
"query" : {
"expression" : "StateName = :StateName",
"expressionValues" : {
":StateName" : { "S" : "${context.arguments.StateName}" },
}
},
"index" : "StateName-index-copy",
"select" : "ALL_ATTRIBUTES",
"filter" : {
"expression" : "#population >= :population",
"expressionNames" : {
"#population" : "population"
},
"expressionValues" : {
":population" : $util.dynamodb.toDynamoDBJson($ctx.args.population)
}
}
}


我在这里使用了一个示例,其中您的查询可能还需要根据每个县的人口规模进行过滤。这可能不代表您要查找的内容,但希望能有所帮助。

使用更多信息进行编辑4/16/18

我已逐步编写了有关此主题的更多信息,以逐步理解这些概念。

这里的关键不仅是响应模板,还包括您要返回的字段(因为这是GraphQL的本质)。让我们以示例的方式进行介绍。现在您将返回带有GraphQL的单个项目(因为您的响应模板将数组转换为单个项目),因此您需要更改预期的GraphQL查询响应类型。假设您的架构中有一个GraphQL类型,如下所示:

type State {
id: ID!
population: String!
governor: String!
}

type Query {
allStates: [State]
}


如果您仅按照上述方式在模板中转换响应,则运行以下命令将看到诸如“类型不匹配错误,预期类型为LIST”的错误:

query {
allStates{
id
population
}
}


那是因为您的回复不再返回单个项目。相反,您需要更改GraphQL响应类型 [State]以匹配模板转换正在执行的 State,如下所示:

type State {
StateName: String
}

type Query {
allStates: State
}


现在,如果您的解析器请求模板正在执行一些返回项列表的操作(例如DynamoDB扫描或查询),则可以将列表转换为响应模板中的单个项,如下所示:

#set($convert = {"StateName" : $ctx.result.items })
$util.toJson($convert)


然后运行以下GraphQL查询:

query {
allStates{
StateName
}
}


然后,您将获得一个包含结果数组的单个对象:

{
"data": {
"allStates": {
"StateName": "[{id=1, population=10000, governor=John Smith}]"
}
}
}


但是,尽管这可能指出了您遇到的错误,但返回的是 StateName,我想从您最初的问题中考虑,通过组合响应中的记录以进行一些优化以及一些潜在的过滤,您希望做更多的事情。一种实现方法是创建一个数组(或者您可以创建一个映射{})并根据某些条件填充它。例如,修改查询以将 StateName作为参数:

type Query {
allStates(StateName: String!): Post
}


然后,您可以在解析器响应模板中对此进行过滤,方法是使用 #foreach#if()条件,然后仅在响应中的项目符合您所请求的状态时才调用 .add()

#set($convert = {"StateName" : [] })
#foreach($item in $ctx.result.items)
#if($item["StateName"]=="$ctx.args.StateName")
$util.qr($convert.get("StateName").add("$item"))
#end
#end
$util.toJson($convert)


因此,现在您可以运行以下命令:

query {
allStates(StateName:"Texas"){
StateName
}
}


这将只返回您作为参数传递的特定状态的结果。但是您会注意到查询的选择集是 StateName。通过在GraphQL类型中列出可能的状态,可以引入更多的灵活性:

type State {
StateName: String
Seattle: String
Texas: String
}


现在,您可以更改解析器响应模板,以使用参数构建返回数组,因为它可以在选择集中指定此参数:

#set($convert = {"$ctx.args.StateName" : [] })
#foreach($item in $ctx.result.items)
#if($item["StateName"]=="$ctx.args.StateName")
$util.qr($convert.get("$ctx.args.StateName").add("$item"))
#end
#end
$util.toJson($convert)


因此,我可以运行以下查询:

query {
allPosts(StateName:"Seattle"){
Seattle
}
}


我得到了我的结果。请注意,尽管将 Seattle作为参数传递,但要求返回 Texas

query {
allPosts(StateName:"Seattle"){
Texas
}
}


由于您在地图中创建的响应对象为 Seattle: [...],但您将 Texas作为选择集,因此该选项不起作用。

您可能要做的最后一件事是返回多个状态,这可以通过建立一个以状态名称为键的巨型地图来完成,或者可以通过使用参数或选择集来完成,方法是将状态名称添加到返回类型中如上所述。这取决于您,因此我不确定您会如何希望,但是希望这可以说明您如何操纵响应来满足您的需求。

关于amazon-dynamodb - AWS AppSync查询以成形响应数据(类似于SQL中的分组依据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49722910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com