[英]AppSync/GraphQL filter nested objects
我有一個具有以下結構的 DynamoDB 表
site (String)
addresses (List)
|-> address (String)
|-> isCurrent (Boolean)
我想為當前或所有地址過濾特定站點。
query MyQuery {
getSite(site: "site1", isCurrent: true) {
site
addresses{
adress
isCurrent
}
模式看起來像
type Sites{
site: String!
addresses: [Address]
}
type Address {
address: String
isCurrent: Boolean
}
type Query{
getSite(site: String!, isCurrent:Boolean)
}
我有的解析器
#if($ctx.args.isCurrent)
{
"version": "2017-02-28",
"operation": "Query",
"query": {. // Filter for specific Site
"expression": "#siteName = :siteNameByUser",
"expressionNames": {
"#siteName": "site"
},
"expressionValues": {
":siteNameByUser": {"S": $util.toJson($ctx.args.site)}
}
}, // Filter Current Address(s)
"filter": {
"expression": "addresses.isCurrent = :isActiveByUser",
"expressionValues": {
":isActiveByUser": $util.dynamodb.toDynamoDBJson($ctx.args.isCurrent)
}
}
}
#else
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"site": $util.dynamodb.toDynamoDBJson($ctx.args.site)
}
}
#end
添加過濾器時我沒有得到任何結果(它在沒有過濾器或使用 isCurrent=False 的情況下工作)。 我正在嘗試根據用戶為 isCurrent 發送的值過濾Addresses
列表中的內部對象。 任何幫助深表感謝!
我嘗試編寫一個帶有內部值 (addresses.isCurrent) 過濾條件的解析器。
{
"version": "2017-02-28",
"operation": "Query",
"query": {. // Filter for specific Site
"expression": "#siteName = :siteNameByUser",
"expressionNames": {
"#siteName": "site"
},
"expressionValues": {
":siteNameByUser": {"S": $util.toJson($ctx.args.site)}
}
}, // Filter Current Address(s)
"filter": {
"expression": "addresses.isCurrent = :isActiveByUser",
"expressionValues": {
":isActiveByUser": $util.dynamodb.toDynamoDBJson($ctx.args.isCurrent)
}
}
}
顯然,DynamoDB 不允許您過濾復雜的 object 類型,例如地圖列表(您的情況),請參閱相關問題: DynamoDB: How to store a list of items
如果可能,我建議將您的 DynamoDB 表數據 model 更改為site
, address
, isCurrentAddress
以實現您想要做的事情。 或者您可以在 VTL 響應映射模板中編寫邏輯,以根據 isCurrentAddress 值過濾結果集。 順便說一句,AppSync 最近推出了JavaScript 解析器,go,看看這是否有助於更簡單地編寫解析器邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.