Запрос к DynamoDB со списком в AWS AppSync - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать запрос AWS AppSync со списком, используя IN:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "my-index",
    "query" : {
        "expression": "id IN :ids",
        "expressionValues" : { ":ids" : $util.dynamodb.toStringSet($ctx.args.ids) }
    },
    "limit": $util.defaultIfNull(${ctx.args.first}, 20),
    "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.after, null))
}

Однако, пробуя его с параметрами, такими как:

query ListItemsWithIdList {
  listItemsWithIdList(first:20, ids: ["id1", "id2"]) {
    items {
      id
    }
    nextToken
  }
}

Выдаетошибка:

Unable to parse the JSON document: 'Unexpected character ('S' (code 83)): was expecting double-quote to start field name
at [Source: (String)\"{
    \"version\" : \"2017-02-28\",
    \"operation\" : \"Query\",
    \"index\" : \"my-index\",
    \"query\" : {
        \"expression\": \"id IN :ids\",
        \"expressionValues\" : { \":ids\" : {SS=[id1, id2]} }
    },       
    \"limit\": 20,
    \"nextToken\": null
}\"; line: 7, column: 47]'"

Кажется, можно использовать IN для оператора сравнения запросов;однако, как я могу передать String List в качестве параметра и извлечь результаты, чьи идентификаторы находятся среди этих предоставленных параметров?

РЕДАКТИРОВАТЬ: Исправлена ​​опечатка имени переменной.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Я не думаю, что AWS AppSync поддерживает IN только сейчас.Я пытаюсь проверить ваш сценарий и найти решение с использованием функции contains().

enter image description here

Вот результат после запроса:

enter image description here

Другим альтернативным решением является использование Scan (не рекомендуется)

{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "filter" : {
        "expression": "contains (:authors, author)",
        "expressionValues" : {
            ":authors" : $util.dynamodb.toDynamoDBJson($ctx.args.authors)
        }
    }
}

Кстати, поддержка AWS AppSync BatchGetItemоперация.Вы можете передать список ключей в одном запросе и вернуть результаты из таблицы.
Ссылка: https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-dynamodb-batch.html
Here - пример, и я протестировал, что он работает как шарм:

## REQUEST MAPPING
#set($authors = [])
#foreach( $author in $ctx.args.authors )
    #set($map = {})
    $util.qr($map.put("author", $util.dynamodb.toString($author)))
    $util.qr($authors.add($map))
#end

{
    "version" : "2018-05-29",
    "operation" : "BatchGetItem",
    "tables" : {
        "tbDiary": {
            "keys": $util.toJson($authors),
            "consistentRead": true
        }
    }
}

## RESPONSE MAPPING
$util.toJson($ctx.result.data.tbDiary)
0 голосов
/ 20 декабря 2018

Надеюсь, вы уже решили это.Однако в вашей настройке есть две проблемы:

Это должно быть выражением фильтра, и, поскольку у вас нет ключевого условия, это может даже быть сканирование вместо запроса

Затем возникают проблемы с синтаксисом (именно из-за этого действительно возникает ошибка): В выражении EXPRESSION добавьте скобки к переменной "expression": "id IN (: ids"),

И в EXPRESSIONVALUES используют toStringSetJson вместо toStringSet "expressionValues": {": ids": $ util.dynamodb.toStringSetJson ($ ctx.args.ids)}

Надеюсь, это поможет.

0 голосов
/ 25 сентября 2018

Я думаю, что здесь может быть 2 проблемы:

  • Ваши аргументы в запросе listItemsWithIdList принимают аргумент с именем userIds.У вас есть $ctx.args.ids) в шаблоне Resolver.Вам нужно использовать одно и то же имя аргумента в обоих местах.

  • Когда вы используете $util.dynamodb.toStringSet в своем шаблоне отображения, как вы видите в ошибке, он преобразуется в { \":ids\" : {SS=[id1, id2]} }.Однако вы хотите, чтобы значения идентификаторов содержались в кавычках.AWS AppSync предоставляет для этой цели еще один служебный метод.Вы можете изменить свой шаблон на $util.dynamodb.toStringSetJson, который затем преобразуется в { \":ids\" : {SS=[\"id1\", \"id2\"]} }.

Дайте мне знать, если это решило вашу проблему.Вот ссылка на Утилиты шаблонов сопоставления резольвера.

...