LoginSignup
0
0

More than 1 year has passed since last update.

ScanではなくQueryで取得するAppSyncのリゾルバー

Last updated at Posted at 2022-12-10

概要

この記事では、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)),
}

operationScanになっていることが見て取れます。

変更後

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)),
}

実行結果

DB

DB

クエリ

クエリ
取得できることを確認できました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0