概要
この記事では、AppSyncのlist機能をScanではなくQueryでおこなうリゾルバーを紹介します。
前提条件
- DynamoDBが用意されていること
- AppSyncのスキーマが作成されていること
デフォルト
AppSyncをウィザードで作成すると、デフォルトで下記のようなリクエストマッピングテンプレートが生成されます。
{
"version": "2017-02-28",
"operation": "Scan",
"filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($ctx.args.filter) #else null #end,
"limit": $util.defaultIfNull($ctx.args.limit, 20),
"nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),
}
operation
がScan
になっていることが見て取れます。
変更後
Scanではテーブル内の全データを確認しますが、
Queryに変更することで、指定された値(ここではbroadcaster
)と一致するデータのみ確認をします。
スキーマ
対象箇所のみ抜粋。
type Radio {
broadcaster: String!
program_name: String
cast: [String!]
datetime: String!
favorite: Boolean
}
type RadioConnection {
items: [Radio]
nextToken: String
}
input TableRadioFilterInput {
favorite: TableBooleanFilterInput
}
input TableBooleanFilterInput {
ne: Boolean
eq: Boolean
}
type Query {
listRadio(
broadcaster: String!, #ここにキーを追加
filter: TableRadioFilterInput,
limit: Int,
nextToken: String
): RadioConnection
}
リゾルバー
{
"version": "2017-02-28",
"operation" : "Query",
"query" : {
"expression" : "#broadcaster = :broadcaster",
"expressionNames" : {
"#broadcaster" : "broadcaster"
},
"expressionValues" : {
":broadcaster" : $util.dynamodb.toDynamoDBJson($ctx.args.broadcaster)
}
},
"filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($ctx.args.filter) #else null #end,
"limit": $util.defaultIfNull($ctx.args.limit, 500),
"nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),
}