У меня есть таблица 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).
Я пытаюсь отфильтровать внутренние объекты в списке Addresses на основе значения, которое пользователь отправляет для isCurrent. Буду признателен за любую оказанную помощь!
Я попытался написать преобразователь с условием фильтрации для внутреннего значения (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 не позволяет фильтровать сложные типы объектов, такие как список карт (ваш случай), см. связанный вопрос: DynamoDB: как хранить список элементов
Я бы предложил изменить модель данных таблицы DynamoDB, если это возможно, на site, address, isCurrentAddress, чтобы достичь того, что вы пытаетесь сделать. Или вы можете
напишите логику в шаблоне сопоставления ответов VTL, чтобы отфильтровать набор результатов на основе значения isCurrentAddress. Кстати, AppSync недавно запустил Резолверы JavaScript, просмотрите их и посмотрите, поможет ли это упростить написание логики вашего резолвера.