Набор данных результатов из DynamoDB Query с использованием GSI не возвращает правильные результаты - PullRequest
0 голосов
/ 26 марта 2019

У меня есть таблица динамических БД, в которой в настоящее время хранятся все события, происходящие в моей системе в отношении каждого продукта.В основной таблице имеется первичный ключ с хэш-комбинацией productid, eventtype и eventcategory, а также ключ сортировки как время создания.Таблица была создана, и в нее были добавлены данные.

Позже я добавил в таблицу новый GSI с такими атрибутами, как Вторичный хэш (который представляет собой просто комбинацию eventcategory и eventtype (исключая productid) и CreationTime в качестве ключа сортировки. Это было добавлено, чтобы я мог запрашиватьнесколько продуктов одновременно.

Кажется, GSI работает нормально, однако только позже я понял, что возвращаемые данные неверны

Вот сценарий. (Я выполняю все эти запросы для недавносоздан индекс) Я запрашивал продукты за последние 30 дней, и Запрос возвращает 312 записей. Однако, когда я выполняю тот же запрос в течение последних 90 дней, он возвращает мне только 128 записей (что неверно, должно быть по крайней мере равным илибольше, чем записи последних 30 дней)

У меня уже есть логика разбиения на страницы, встроенная в мой код, так что lastEvaluatedKey проверяется каждый раз, чтобы выполнить цикл и извлечь следующий набор записей, а после цикла всерезультаты объединяются.

Не уверен, что я что-то упустил.

Любые предложения будут оценены.

var limitPtr *int64
    if limit > 0 {
        limit64 := int64(limit)
        limitPtr = &limit64
    }
input := dynamodb.QueryInput{
        ExpressionAttributeNames: map[string]*string{
            "#sch": aws.String("SecondaryHash"),
            "#pkr": aws.String("CreationTime"),
        },
        ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
            ":sch": {
                S: aws.String(eventHash),
            },
            ":pkr1": {
                N: aws.String(strconv.FormatInt(startTime, 10)),
            },
            ":pkr2": {
                N: aws.String(strconv.FormatInt(endTime, 10)),
            },
        },
        KeyConditionExpression: aws.String("#sch = :sch AND #pkr BETWEEN :pkr1 AND :pkr2"),
        ScanIndexForward:       &scanForward,
        Limit:                  limitPtr,
        TableName:              aws.String(ddbTableName),
        IndexName:              aws.String(ddbIndexName),
    }

1 Ответ

2 голосов
/ 26 марта 2019

Вы достигли максимального количества предметов для оценки (необязательно количество подходящих предметов). Лимит составляет 1 МБ.

Ответ будет содержать LastEvaluatedKey параметр, это идентификатор последнего элемента. Вы должны выполнить новый запрос с дополнительным параметром ExclusiveStartKey . (ExclusiveStartKey должен быть равен значению LastEvaluatedKey.)

Когда LastEvaluatedKey пуст, вы достигли конца таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...