AppSync/GraphQL фильтруют вложенные объекты

У меня есть таблица 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)      
    }
  }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по всему, DynamoDB не позволяет фильтровать сложные типы объектов, такие как список карт (ваш случай), см. связанный вопрос: DynamoDB: как хранить список элементов

Я бы предложил изменить модель данных таблицы DynamoDB, если это возможно, на site, address, isCurrentAddress, чтобы достичь того, что вы пытаетесь сделать. Или вы можете напишите логику в шаблоне сопоставления ответов VTL, чтобы отфильтровать набор результатов на основе значения isCurrentAddress. Кстати, AppSync недавно запустил Резолверы JavaScript, просмотрите их и посмотрите, поможет ли это упростить написание логики вашего резолвера.

Другие вопросы по теме