概要
この記事では、DynamoDBのlimit値によるAppSyncのエラーと対処法について紹介します。
内容
AppSyncをウィザードで作成すると、自動でリゾルバーを生成します。
これはlist機能も同様で、下記のようなリクエストマッピングテンプレートが記載されます。
{
"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)),
}
ただ、このまま使用すると、DBのデータが20件を超えた時点で、
期待の挙動をしなくなります。
例えば、全データを取得したくても20件しか返ってこない、
filterで条件を絞ってクエリを送っても何も返ってこない、などが起きます。
これはlimit
に20
が設定されていることが原因です。
仮に、filterで条件を絞ってクエリを送った場合、
DBの中から20件取得して、そこ中から条件を絞った結果を返します。
そのため、DBにはデータはあるにもかかわらず、
取得した20件にないことで指定のデータが返ってこないことになります。
単純な解消方法は、limit値を上げることです。
{
"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, 500),
"nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),
}
この方法で、ひとまず500件を取得するように変更できます。
データの数が決まっている場合や、ある程度想定できる場合は、
この方法で、数値を直接変更すれば問題ありません。
また、
ScanではなくQueryで取得することで解決できることもあります。
詳しくは、ScanではなくQueryで取得するAppSyncのリゾルバーを参照ください。