Я хочу сканировать все элементы за последние 7 дней, поэтому я создаю временную метку в течение 7 дней и фильтрую для отметки времени больше этого значения. Но это сканирование возвращает несколько результатов.
См. Следующий Javascript:
const daysBack = (days) => {
let date = new Date();
date.setDate(date.getDate() - days);
return date.getTime() ;
}
const params = {
TableName: process.env.DYNAMODB_TABLE,
FilterExpression: "#ts > :z",
ExpressionAttributeNames:{
"#ts": "timestamp"
},
ExpressionAttributeValues: {
":z": daysBack(7)
},
};
dynamoDb.scan(params, (error, result) => {
// ...
}
Это связано с тем, что при работе SCAN operation
dynamoDb будет отправлять data upto 1mb only
. Если нужные вам записи имеют размер более 1 мб, автоматически происходит разбиение на страницы.
Если вы зарегистрируете свой результат, вы найдете атрибут LastEvaluatedKey
если этот атрибут присутствует, тогда вам придется сделать другой вызов, чтобы получить оставшиеся данные. Этот вызов должен быть реализован рекурсивно, и вы должны его остановить, когда атрибут LastEvaluatedKey
отсутствует.
Давайте посмотрим на этот пример, где данные проекта извлекаются рекурсивно, и все данные добавляются в массив, а затем отправляются.
let getFromDb = function (params, callback) {
params.ConsistentRead = true;
let projectCollection = [];
dynamodbclient.scan(params, onQuery);
function onQuery(err, data) {
const methodName = 'onQuery';
if (err) {
callback(err);
log.error(err, {
class: className,
func: methodName
});
} else {
for (let i = constant.LENGTH_ZERO; i < data.Items.length; i++) {
projectCollection.push(data.Items[i]);
}
if (typeof data.LastEvaluatedKey !== 'undefined') {
params.ExclusiveStartKey = data.LastEvaluatedKey;
dynamodbclient.scan(params, onQuery);
} else {
callback(err, projectCollection); //recursive call
}
}
}
};
ExclusiveStartKey
?