#amazon-web-services #amazon-dynamodb #dynamodb-queries #documentclient
#amazon-web-services #amazon-dynamodb #dynamodb-запросы #documentclient
Вопрос:
Я пытаюсь выполнить разбивку на страницы в простой таблице DynamoDB для запросов по диапазону дат и надеялся преобразовать LastEvaluatedKey в логическое значение «hasMoreResults» для использования моим интерфейсом, но теперь вижу, что непустой LastEvaluatedKey иногда может отображаться в результатах, даже если количество элементов вдиапазон дат не превышает моего ПРЕДЕЛА. Означает ли это, что мне всегда нужно будет выполнять последующий запрос, который не вернет никаких дополнительных элементов?
Моя таблица выглядит примерно так:
[
{PK: "john", SK: "2021-01-01:08:00", amount: 1},
{PK: "john", SK: "2021-01-01:20:00", amount: 2},
{PK: "john", SK: "2021-01-02:08:00", amount: 3},
{PK: "john", SK: "2021-01-02:20:00", amount: 4},
{PK: "john", SK: "2021-01-03:08:00", amount: 5},
{PK: "john", SK: "2021-01-03:20:00", amount: 6}
...and on for all of January
];
Используя JavaScript DocumentClient, мой запрос выглядит следующим образом:
async function getEntriesByDate({name, startDate, endDate, limit, sort}) {
return await docClient.query({
TableName: "someTableName",
KeyConditionExpression: "#pk = :pk and #sk Between :startDate And :endDate",
ExpressionAttributeNames: {
"#pk": "PK",
"#sk": "SK"
},
ExpressionAttributeValues: {
":pk": name,
":startDate": startDate,
":endDate": endDate
},
ScanIndexForward: sort === "asc",
Limit: limit
}).promise();
}
Если я вызову функцию с конечной датой, точно совпадающей с датой четвертого элемента, и ПРЕДЕЛОМ 4:
getEntriesByDate({name: "john", startDate: "2021-01-01:08:01", endDate: "2021-01-02:20:01", limit: 4, sort:"asc"});
Я получаю следующий результат:
{
"Items": [
{"PK": "john", "SK": "2021-01-01:08:00", "amount": 1},
{"PK": "john", "SK": "2021-01-01:20:00", "amount": 2},
{"PK": "john", "SK": "2021-01-02:08:00", "amount": 3},
{"PK": "john", "SK": "2021-01-02:20:00", "amount": 4 }
],
"Count": 4,
"ScannedCount": 4
}
Отлично, нет LastEvaluatedKey. чего я и ожидаю. Но если я вызываю функцию с теми же аргументами, за исключением добавления минуты к конечной дате, я получаю:
{
"Items": <same as in last query, which is expected>,
"Count": 4,
"ScannedCount": 4,
"LastEvaluatedKey": {
"SK": "2021-01-02:20:00",
"PK": "john"
}
}
и LastEvaluatedKey
появляется, даже если нет дополнительных элементов, удовлетворяющих запросу. Существует ли идиоматическое решение этой проблемы? Необходим ли последующий запрос, возможно, с использованием ExclusiveStartKey
, внутри моей функции для обеспечения надежного hasMoreResults
значения?
Комментарии:
1. Я думаю, что проблема здесь в том, как DynamoDB распределяет данные по своим разделам, как описано в этой документации . Короче говоря: DynamoDB не может быть уверен, что больше не осталось элементов, поэтому он возвращает
LastEvaluatedKey
значение, даже если больше элементов не осталось. Но это типичная проблема, и я хотел бы также узнать хорошее решение для нее. С нетерпением жду отличного ответа 🙂2. Спасибо за информацию. На данный момент я добавил второй запрос с единственной целью определить, есть ли больше результатов. Это для игрушечного приложения, поэтому меня не слишком волнует неэффективность, но это кажется грубым, и я надеюсь, что кто-нибудь сможет предложить лучший подход (при условии, что он есть).