AWS AppSyn c не возвращаются все записи из DynamoDB - PullRequest
0 голосов
/ 07 мая 2020

При использовании DynamoDB в качестве источника данных я показываю общее количество записей в 135 строк выборки данных. Однако когда я выполняю запрос listAll, я вижу очень случайные данные на экране, ограниченные 20 записями.

Когда я исследовал, добавив аргумент limit, установленный на 150, я получаю все данные. Если я сохраню ограничение до двух или трех и попытаюсь добавить фильтр для запроса результатов, я не получу любые .

Когда я продолжил проверять шаблон сопоставления запросов, я обнаружил, что значение по умолчанию для лимита передается как двадцать. Следовательно, мы видим двадцать случайных записей.

"limit": $util.defaultIfNull($ctx.args.limit, 20)

Итак, если ваш фильтр содержит сведения о любой из этих двадцати записей, вы получите результат. Если в DynamoDB есть что-нибудь еще, оно не будет возвращено.

Если вы удалите этот атрибут limit из RequestMappingTemplate, вы увидите все данные. Но тогда, когда вы превысите лимит, он не будет учтен, и вы получите все результаты.

Из этого упражнения я вижу, что лимит напрямую связан с чем-то вроде индекса строки.

Причина, по которой я говорю это: предположим, вы выполняете запрос с фильтром и не получаете никаких результатов, но доступен nextToken. Если вы снова выполните запрос с этим nextToken с ограничением, скажем, двумя, вы больше не получите никаких результатов, если эти записи, которые вы ищете, не подпадают под двадцать записей, которые извлекает запрос.

Другими словами, сначала создается limit, и только , затем применяет фильтр.

Я тоже проверил то же самое в DynamoDB, у меня нет таких проблем при фильтрации.

Кто-нибудь может мне с этим помочь? Я читал здесь другие похожие сообщения, но они не касаются сценария, в котором limit ограничивает пул запросов, а не количество возвращаемых результатов.

Ответы [ 2 ]

0 голосов
/ 15 мая 2020

Спасибо @Ben, наконец, я смог получить результаты, используя сообщение GSI, изменив шаблон сопоставления запросов, как показано ниже:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "brand-index",
    "query" : {
        "expression": "#brand = :brand",
        "expressionNames" : {
            "#brand" : "brand"
        },
        "expressionValues" : {
            ":brand" : $util.dynamodb.toDynamoDBJson($ctx.args.brand)    
        }
    },
    "filter" : {
        "expression" : "contains(#type, :type)",
        "expressionNames" : {
            "#type" : "type"
        },
        "expressionValues" : {
            ":type" : $util.dynamodb.toDynamoDBJson($ctx.args.type)
        }
    }
}

Проблема возникла из-за неправильного понимания Ha sh в качестве комментария и удалила его ранее (# бренд). Также я заметил, что мы не можем использовать первичный ключ в фильтре, а также ключ сортировки.

Спасибо, Шахид Наваз

0 голосов
/ 07 мая 2020

Когда вы запрашиваете или просматриваете таблицу DynamoDB, вы можете ограничить количество возвращаемых элементов. Однако любая фильтрация выполняется после ограничения, что может дать вам страницы «без данных» перед нахождением элементов, которые вы ищете, как вы и описали.

Обратите внимание, что, хотя вы можете удалить ограничение, DynamoDB по-прежнему будет обеспечивать максимальный размер страницы 1 МБ. Количество предметов будет зависеть от размера ваших предметов. Поэтому, если в вашей таблице всегда будет <1 МБ данных, вам нужно будет реализовать разбиение на страницы во внешнем интерфейсе, иначе ваш запрос не будет проверять все элементы, если размер страницы (количество элементов) слишком велик. </p>

Если вы хотите, чтобы после фильтрации количество результатов на странице было более постоянным, вы, вероятно, захотите запросить индекс, а не фильтр. Вы можете попробовать добавить GSI, чтобы запрашивать только те элементы, которые вы ищете. Это сделает ваш запрос более эффективным и даст вашему интерфейсу более согласованное количество элементов в ответе каждой страницы.

...